快速入门
🤗 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=1
和 sequence_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'