

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

# 取得生成式 AI 推論部署建議
<a name="generative-ai-inference-recommendations-get-started"></a>

AI 建議任務會分析模型和工作負載特性，以產生針對成本、延遲或輸送量最佳化的部署組態。服務會評估執行個體類型、套用推測解碼等最佳化，並對實際 GPU 基礎設施上的每個組態進行基準測試。

## 先決條件
<a name="generative-ai-inference-recommendations-get-started-prereqs"></a>

在建立建議任務之前，您需要下列項目：
+ 使用 SafeTensor 權重，以 HuggingFace 檢查點格式存放在 Amazon S3 中的模型成品
+ 建議輸出的 Amazon S3 儲存貯體
+ Identity AWS and Access Management (IAM) 執行角色，授予 SageMaker AI 存取模型成品和輸出儲存貯體的權限

## 步驟 1：建立建議任務
<a name="generative-ai-inference-recommendations-get-started-create"></a>

建議任務會分析您的模型並產生部署建議。您可以指定模型位置、輸出位置、工作負載組態和效能目標。

**Python (boto3)**

```
response = client.create_ai_recommendation_job(
    AIRecommendationJobName="my-recommendation-job",
    ModelSource={
        "S3": {
            "S3Uri": "s3://DOC-EXAMPLE-BUCKET/models/my-model/",
        }
    },
    OutputConfig={
        "S3OutputLocation": "s3://DOC-EXAMPLE-BUCKET/recommendations/"
    },
    PerformanceTarget={
        "Constraints": [
            {"Metric": "ttft-ms"}
        ]
    },
    AIWorkloadConfigIdentifier="my-recommendation-workload",
    RoleArn="arn:aws:iam::111122223333:role/ExampleRole",
)
print(response["AIRecommendationJobArn"])
```

**AWS CLI**

```
aws sagemaker create-ai-recommendation-job \
  --ai-recommendation-job-name "my-recommendation-job" \
  --model-source '{"S3": {"S3Uri": "s3://DOC-EXAMPLE-BUCKET/models/my-model/"}}' \
  --output-config '{"S3OutputLocation": "s3://DOC-EXAMPLE-BUCKET/recommendations/"}' \
  --performance-target '{"Constraints": [{"Metric": "ttft-ms"}]}' \
  --ai-workload-config-identifier "my-recommendation-workload" \
  --role-arn "arn:aws:iam::111122223333:role/ExampleRole" \
  --region us-west-2
```

您也可以指定以下選用參數：

`ComputeSpec`  
限制要評估的執行個體類型 （最多三個）。例如：`{"InstanceTypes": ["ml.g5.12xlarge", "ml.p4d.24xlarge"]}`

`OptimizeModel`  
設定為 `true` 以允許模型最佳化，例如投機式解碼。

`InferenceSpecification`  
指定推論架構。有效值：`LMI`、`VLLM`。

## 步驟 2：監控任務狀態
<a name="generative-ai-inference-recommendations-get-started-monitor"></a>

輪詢任務狀態，直到達到結束狀態為止。

**Python (boto3)**

```
import time

while True:
    response = client.describe_ai_recommendation_job(
        AIRecommendationJobName="my-recommendation-job"
    )
    status = response["AIRecommendationJobStatus"]
    print(f"Status: {status}")
    if status in ("Completed", "Failed", "Stopped"):
        break
    time.sleep(30)
```

**AWS CLI**

```
aws sagemaker describe-ai-recommendation-job \
  --ai-recommendation-job-name "my-recommendation-job" \
  --region us-west-2
```

## 步驟 3：檢閱建議
<a name="generative-ai-inference-recommendations-get-started-results"></a>

當任務完成時，描述回應會包含`Recommendations`陣列。每個建議都包含可立即部署的組態，其中包含下列資訊：

`DeploymentConfiguration`  
容器映像 URI、執行個體類型、執行個體計數和環境變數。您可以使用此組態直接部署到 SageMaker AI 端點。

`ExpectedPerformance`  
經過驗證的效能指標，包括首次使用字符的時間 (TTFT)、P90 和 P99 的請求延遲、字符每秒輸送量，以及請求輸送量。

`OptimizationDetails`  
套用最佳化技術，例如投機式解碼或核心調校，以及其組態參數。

可能套用下列最佳化技術：

推測性解碼  
推測解碼透過平行處理多個字符而非一次處理一個字符，加速文字產生。輕量型投機器在單一步驟中提出數個候選權杖，然後主要模型會在一個向前傳遞中一起驗證權杖，讓候選者同意自己的分佈並捨棄其餘的權杖。投機器經過訓練，符合主要模型的資料分佈，因此可接受更多提案，這些提案會直接轉換為每個向前傳遞產生的更實用字符。主要模型的輸出分佈會保留，因此回應品質不會改變。結果是更高的每秒輸出字符數和更低的字符間延遲 (ITL)，從而改善您的輸送量指標。

核心調校  
核心調校從剖析模型執行圖表開始，以識別適合調校的效能關鍵核心，例如注意力和融合運算子核心。接著會調校其啟動和並排參數，讓實作更符合目標 GPU 硬體和預期的流量模式，例如並行。這些參數會影響記憶體重複使用、快取地區性和平行處理，從而提高執行效率。用於載入資料和運算的管道階段數量也會進行調校，有助於與運算的記憶體移動重疊。透過針對模型、硬體和服務工作負載的特定組合調校這些參數，核心調校可確保 GPU 充分利用，進而改善輸送量和延遲。

下列效能目標指標可供使用：

`ttft-ms`  
第一個字符的時間，以毫秒為單位。

`throughput`  
每秒權杖數。

`cost`  
部署組態的每小時成本。

`ExpectedPerformance` 回應中的每個指標都包含一個`Stat`欄位，指出統計量值`Value`、 和選用的 `Unit`。常見的統計資料包括：`average`、`p50`、`p90`、`p95`、`p99`、 `max`和 `min`。

## 管理建議資源
<a name="generative-ai-inference-recommendations-get-started-manage"></a>

使用下列操作來管理您的建議任務和工作負載組態。

```
# List recommendation jobs
response = client.list_ai_recommendation_jobs(MaxResults=10)
for job in response["AIRecommendationJobs"]:
    print(f"{job['AIRecommendationJobName']} - {job['AIRecommendationJobStatus']}")

# Stop a running job
client.stop_ai_recommendation_job(
    AIRecommendationJobName="my-recommendation-job"
)

# Delete a job (must be in a terminal state)
client.delete_ai_recommendation_job(
    AIRecommendationJobName="my-recommendation-job"
)

# List workload configurations
response = client.list_ai_workload_configs(MaxResults=10)
for config in response["AIWorkloadConfigs"]:
    print(f"{config['AIWorkloadConfigName']} - {config['AIWorkloadConfigArn']}")

# Delete a workload configuration
client.delete_ai_workload_config(
    AIWorkloadConfigName="my-recommendation-workload"
)
```