

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 最佳化工具狀態碎片
<a name="model-parallel-extended-features-pytorch-optimizer-state-sharding"></a>

*最佳化工具狀態碎片*是有用的節省記憶體技術，可跨資料平行裝置群組碎片化最佳化工具狀態 (描述最佳化工具狀態的權重集)。每當您使用具狀態的最佳化工具 (例如 Adam) 或 FP16 最佳化工具 (儲存參數的 FP16 與 FP32 副本) 時，都可使用最佳化工具狀態碎片。

**注意**  
最佳化工具狀態碎片適用 SageMaker 模型平行化程式庫 v1.6.0 及更高版本的 PyTorch。

## 如何使用最佳化工具狀態碎片
<a name="model-parallel-extended-features-pytorch-optimizer-state-sharding-how-to-use"></a>

您可以透過在 `modelparallel` 組態 設定 `"shard_optimizer_state": True` 來開啟*最佳化工具狀態碎片*。

當開啟此功能時，程式庫會基於資料平行處理程度分割模型參數集。對應於第 `i` 個分區的漸層僅會於第 `i` 個資料平行等級縮減。在第一次呼叫 `smp.step` 裝飾項目函式結束時，由 `smp.DistributedOptimizer` 包裝的最佳化工具會重新定義其參數，以便僅限對應目前資料平行等級分區的參數。重新定義的參數稱為*虛擬參數*，並與原始參數共用基礎儲存。在第一次呼叫 `optimizer.step` 期間，會基於這些重新定義的參數建立最佳化工具狀態，這些參數會因為原始分割而進行碎片處理。在更新最佳化工具之後，AllGather 作業 (做為 `optimizer.step` 呼叫的一部分) 會跨資料平行等級執行，以達到一致參數狀態。

**提示**  
當資料平行處理的程度大於 1 且模型具十億個以上的參數時，最佳化工具狀態碎片很有幫助。  
資料平行處理的程度由 `(processes_per_host * instance_count / pipeline_parallel_degree)` 計算，而 `smp.dp_size()` 函式會在背景處理大小。

**設定 SageMaker PyTorch 估算器**

```
mpi_options = {
    "enabled" : True,
    "processes_per_host" : 8,               # 8 processes
    "custom_mpi_options" : "--mca btl_vader_single_copy_mechanism none "
}

smp_options = {
    "enabled":True,
    "parameters": {
        "microbatches": 4,
        "pipeline_parallel_degree": 2,    # alias for "partitions"
        "placement_strategy": "cluster",
        "tensor_parallel_degree": 2,      # tp over 2 devices
        "ddp": True,
        "shard_optimizer_state": True
    }
}
```

**調整 PyTorch 訓練指令碼**

請參閱*結合管道平行處理的張量平行處理*區段的[調整 PyTorch 訓練指令碼](model-parallel-extended-features-pytorch-tensor-parallelism-examples.md#model-parallel-extended-features-pytorch-tensor-and-pipeline-parallelism-script)。此指令碼不需要其他修改。