AWS Trainium & Inferentia 文件
新增對新架構的支援
並獲得增強的文件體驗
開始使用
新增對新架構的支援
注意: ❗本節不適用於透過 `transformers-neuronx` 集成了自迴歸取樣的解碼器模型的推理。如果您想為這些模型新增支援,請在 Optimum Neuron 的 GitHub 倉庫中提出一個 issue,並聯系維護人員尋求幫助。
你想在 AWS Inferentia 或 Trainium 上匯出並執行一個新模型嗎?請檢視指南,並向 🤗 Optimum Neuron 的 GitHub 倉庫提交一個拉取請求(pull request)!
要在 Optimum Neuron 庫中支援新的模型架構,需要遵循以下步驟:
- 實現自定義的 Neuron 配置。
- 匯出並驗證模型。
- 向 GitHub 倉庫貢獻程式碼。
實現自定義的 Neuron 配置
為了支援將新模型匯出為與 Neuron 相容的格式,首先需要定義一個 Neuron 配置,透過指定以下內容來描述如何匯出 PyTorch 模型:
- 輸入名稱。
- 輸出名稱。
- 用於追蹤模型的虛擬輸入(dummy inputs):Neuron 編譯器透過追蹤記錄計算圖,並在生成的 `TorchScript` 模組上工作。
- 用於控制硬體效率(延遲、吞吐量)和準確性之間權衡的編譯引數。
根據模型和任務的選擇,我們使用配置類來表示上述資料。每個配置類都與特定的模型架構相關聯,並遵循 `ArchitectureNameNeuronConfig` 的命名約定。例如,指定 BERT 模型 Neuron 匯出的配置是 `BertNeuronConfig`。
由於許多架構的 Neuron 配置具有相似的屬性,🤗 Optimum 採用了一個三級類層次結構:
- 抽象和通用的基類。這些類處理所有基本功能,同時與模態(文字、影像、音訊等)無關。
- 中間層類。這些類與模態相關。根據支援的輸入不同,同一模態可能存在多個配置類。它們指定了應使用哪些輸入生成器來生成虛擬輸入,但與具體模型無關。
- 特定於模型的類,如上面提到的 `BertNeuronConfig`。這些是實際用於匯出模型的類。
示例:為 ESM 模型新增支援
這裡我們以支援 ESM 模型為例。讓我們在 `optimum/exporters/neuron/model_configs.py` 中建立一個 `EsmNeuronConfig` 類。
當一個 Esm 模型被解釋為文字編碼器時,我們可以繼承中間層類 `TextEncoderNeuronConfig`。由於 Esm 的建模和配置在被解釋為編碼器時與 BERT 幾乎相同,我們可以使用 `NormalizedConfigManager` 並設定 `model_type=bert` 來規範化配置,從而為模型追蹤生成虛擬輸入。
最後一步,由於 `optimum-neuron` 是 `optimum` 的擴充套件,我們需要將我們建立的 Neuron 配置註冊到 TasksManager 中。這可以透過使用 `register_in_tasks_manager` 裝飾器,並指定模型型別和支援的任務來完成。
@register_in_tasks_manager("esm", *["feature-extraction", "fill-mask", "text-classification", "token-classification"])
class EsmNeuronConfig(TextEncoderNeuronConfig):
NORMALIZED_CONFIG_CLASS = NormalizedConfigManager.get_normalized_config_class("bert")
ATOL_FOR_VALIDATION = 1e-3 # absolute tolerance to compare for comparing model on CPUs
@property
def inputs(self) -> List[str]:
return ["input_ids", "attention_mask"]
匯出並驗證模型
在你實現了 Neuron 配置類之後,現在快速測試一下它是否按預期工作:
- 匯出
optimum-cli export neuron --model facebook/esm2_t33_650M_UR50D --task text-classification --batch_size 1 --sequence_length 16 esm_neuron/
在匯出過程中,系統會呼叫 `validate_model_outputs` 函式,透過將匯出的 Neuron 模型輸出與在 CPU 上的 PyTorch 結果進行比較來驗證模型輸出。你也可以透過以下方式手動驗證模型:
from optimum.exporters.neuron import validate_model_outputs
validate_model_outputs(
neuron_config, base_model, neuron_model_path, neuron_named_outputs, neuron_config.ATOL_FOR_VALIDATION
)
- 推理(可選)
from transformers import AutoTokenizer
from optimum.neuron import NeuronModelForSequenceClassification
model = NeuronModelForSequenceClassification.from_pretrained("esm_neuron/")
tokenizer = AutoTokenizer.from_pretrained("esm_neuron/")
inputs = tokenizer("Hello, my dog is cute", return_tensors="pt")
logits = model(**inputs).logits
向 GitHub 倉庫貢獻程式碼
我們差不多都準備好了。現在提交一個拉取請求(pull request),讓你的工作成果能被所有社群成員使用!
- 在 Optimum Neuron 的 GitHub 倉庫中建立一個 issue,描述新功能,以便 Optimum Neuron 的維護者能夠看到。
- 將模型新增到 `optimum-neuron/tests/exporters/exporters_utils.py` 的匯出器測試中,以及 `optimum-neuron/tests/inference/inference_utils.py` 的推理測試中。
- 提交一個拉取請求!(別忘了將它與你建立的 issue 關聯起來,這樣維護者就能更好地跟蹤並及時提供幫助。)
我們通常會測試較小的檢查點以加速持續整合(CI),你可以在 `Hugging Face 內部測試組織` 下找到用於測試的微型模型。
你已經為社群在 Neuron 上實現了一個新模型的可用性!感謝你加入我們,共同推動優秀機器學習的民主化程序 🤗。