在 Amazon SageMaker 上使用 Hugging Face Transformers 部署 GPT-J 6B

Hugging Face 詳細說明了一種使用 Amazon SageMaker 和 Hugging Face Inference Toolkit 部署 EleutherAI 的 GPT-J 6B(一個開源的 60 億參數語言模型)以進行即時推論的方法。這種方法解決了模型載入時間過長的關鍵挑戰,否則載入時間可能會超過 Amazon SageMaker 施加的 60 秒請求限制。

為生產環境優化模型載入時間

由於 GPT-J 6B 的記憶體占用量和載入速度,將其部署到生產環境具有挑戰性。這 60 億參數模型的權重約佔 24GB 的記憶體。以 float32 格式載入模型需要至少 48GB 的 CPU RAM(一個用於初始權重,一個用於檢查點)。

為了提高易用性,EleutherAI 提供了 float16 權重。當結合 transformers 選項來減少記憶體占用時,CPU RAM 的需求會降至約 12.1GB。然而,標準的載入方法仍然很慢:

  • 標準載入:P3.2xlarge AWS EC2 實例上載入模型大約需要 3 分 32 秒。
  • 磁碟儲存載入: 將模型儲存在磁碟上可將此時間縮短至 1 分 23 秒。

由於 Amazon SageMaker 對請求回應有 60 秒的限制,這些載入時間使得該模型不適合用於可擴展且可靠的生產工作負載。

使用 torch.save 加速載入時間

透過使用 torch.save(model, PATH)torch.load(PATH) 而不是建議的 from_pretrained 方法,GPT-J 的載入時間可以從 1 分 23 秒減少到 7.7 秒——速度提升了約 10.5 倍。

關鍵要求: 為了避免不相容性,使用者必須確保儲存模型時使用的 PyTorch 和 Transformers 版本與載入模型時使用的版本一致。

在 Amazon SageMaker 上的部署工作流程

要為即時推論部署 GPT-J 6B,使用的是以下工作流程:

  1. 模型序列化: 使用 from_pretrained 載入 GPT-J 並使用 torch.save() 將其儲存為 .pt 檔案。
  2. 產出物建立: 建立一個包含模型權重和必要檔案(例如 tokenizer.json)的 model.tar.gz 壓縮檔。接著將此產出物上傳到 S3 儲存桶。
  3. Endpoint 部署: 使用 Amazon SageMaker Python SDK 中的 HuggingFaceModel 類別來部署模型。

對於此部署,Hugging Face 建議使用 ml.g4dn.xlarge 實例類型(NVIDIA T4 GPU),其每月成本約為 500 美元。

推論與使用最佳實踐

一旦部署了 Endpoint,即可透過 predictor.predict 方法執行預測。Hugging Face Inference toolkit 允許透過請求負載中的 parameters 屬性來自定義生成過程。

生成策略

  • Greedy Search: 預設的請求方法。在第一次請求後,推論時間大約為 3 秒。
  • Beam Search: 透過在參數中加入 "num_beams": 5 來進行配置。推論時間大約為 3.3 秒。
  • 自定義參數化: 使用者可以調整 max_lengthtemperature 來控制輸出長度和隨機性。例如,一個 max_length 為 512 個 token 的請求大約需要 38 秒。

進階少樣本提示 (Few-Shot Prompting)

對於進階使用案例,例如少樣本預測,可以使用 eos_token_id 在特定 token(例如 ###)處停止生成。這使得模型能夠遵循提示中提供的模式並在模式完成後停止生成。對於這些任務,推論時間通常介於 15 到 45 秒之間。

Sources

相關