AWS Trainium & Inferentia 文档

快速入门

Hugging Face's logo
加入 Hugging Face 社区

并获取增强型文档体验

入门

快速入门

🤗 Optimum Neuron 的设计目标只有一个:为任何 🤗 Transformers 用户简化训练和推理过程,同时充分利用 AWS 加速器的强大功能

训练

需要了解两个主要类

  • NeuronArgumentParser:继承 Transformers 中的原始 HfArgumentParser,并对参数值进行额外检查,以确保它们与 AWS Trainium 实例兼容。
  • NeuronTrainer:训练器类,负责编译和分发模型以在 Trainium 芯片上运行,并执行训练和评估。

NeuronTrainer🤗 Transformers Trainer 非常相似,将使用 Trainer 的脚本改成在 Trainium 上运行,主要就是将 Trainer 类替换为 NeuronTrainer 类。大多数 示例脚本 就是从其 原始对应脚本 改过来的。

修改

from transformers import TrainingArguments
-from transformers import Trainer
+from optimum.neuron import NeuronTrainer as Trainer
training_args = TrainingArguments(
  # training arguments...
)
# A lot of code here
# Initialize our Trainer
trainer = Trainer(
    model=model,
    args=training_args,  # Original training arguments.
    train_dataset=train_dataset if training_args.do_train else None,
    eval_dataset=eval_dataset if training_args.do_eval else None,
    compute_metrics=compute_metrics,
    tokenizer=tokenizer,
    data_collator=data_collator,
)

所有 Trainium 实例至少配备 2 个 Neuron Core。为了利用这些核心,需要使用 torchrun 启动训练。以下是一个示例,展示如何在 trn1.2xlarge 实例上使用 bert-base-uncased 模型启动训练脚本。

torchrun --nproc_per_node=2 huggingface-neuron-samples/text-classification/run_glue.py \
--model_name_or_path bert-base-uncased \
--dataset_name philschmid/emotion \
--do_train \
--do_eval \
--bf16 True \
--per_device_train_batch_size 16 \
--learning_rate 5e-5 \
--num_train_epochs 3 \
--output_dir ./bert-emotion

推理

可以在 Neuron 设备上进行推理之前,将 🤗 Transformers 模型编译并导出为序列化格式

optimum-cli export neuron \
  --model distilbert-base-uncased-finetuned-sst-2-english \
  --batch_size 1 \
  --sequence_length 32 \
  --auto_cast matmul \
  --auto_cast_type bf16 \
  distilbert_base_uncased_finetuned_sst2_english_neuron/

上面的命令将 distilbert-base-uncased-finetuned-sst-2-english 导出为静态形状:batch_size=1sequence_length=32,并将所有 matmul 操作从 FP32 转换为 BF16。查看 导出器指南,了解更多编译选项。

然后可以使用 NeuronModelForXXX 类在 Neuron 设备上运行导出的 Neuron 模型,这些类类似于 🤗 Transformers 中的 AutoModelForXXX

from transformers import AutoTokenizer
-from transformers import AutoModelForSequenceClassification
+from optimum.neuron import NeuronModelForSequenceClassification

# PyTorch checkpoint
-model = AutoModelForSequenceClassification.from_pretrained("distilbert-base-uncased-finetuned-sst-2-english")
+model = NeuronModelForSequenceClassification.from_pretrained("distilbert_base_uncased_finetuned_sst2_english_neuron")

tokenizer = AutoTokenizer.from_pretrained("distilbert-base-uncased-finetuned-sst-2-english")
inputs = tokenizer("Hamilton is considered to be the best musical of past years.", return_tensors="pt")

logits = model(**inputs).logits
print(model.config.id2label[logits.argmax().item()])
# 'POSITIVE'