LoRA を使用して Amazon SageMaker で Whisper モデルを微調整する | アマゾン ウェブ サービス

LoRA を使用して Amazon SageMaker で Whisper モデルを微調整する | アマゾン ウェブ サービス

Whisper は、さまざまな言語とタスクを網羅する、Web からの 680,000 時間の教師付きデータを使用してトレーニングされた自動音声認識 (ASR) モデルです。 制限の 100 つは、マラーティー語やドラヴィダ語などの低リソース言語でのパフォーマンスの低下です。これは微調整で修正できます。 ただし、Whisper モデルを微調整することは、計算リソースとストレージ要件の両方の点でかなりの課題になっています。 Whisper モデルの完全な微調整を 100 ~ 40 回実行するには、約 4 時間の A7 GPU (XNUMX GB SXMXNUMX) (モデルのサイズとモデル パラメーターによって異なります) が必要で、各微調整チェックポイントには約 XNUMX GB のストレージ スペースが必要です。 この高い計算需要とストレージ需要の組み合わせは、特にリソースが限られた環境では大きな障害となる可能性があり、多くの場合、有意義な結果を達成することが非常に困難になります。

低ランク適応、別名 ロラ、モデルの微調整に独自のアプローチを採用しています。 事前トレーニングされたモデルの重みを静的な状態に維持し、トレーニング可能なランク分解行列を Transformer 構造の各層に導入します。 この方法では、ダウンストリーム タスクに必要なトレーニング可能なパラメーターの数を 10,000 分の 3 に減らし、GPU メモリ要件を XNUMX 分の XNUMX に減らすことができます。 モデルの品質に関しては、LoRA は、トレーニング可能なパラメーターが少ないにもかかわらず、従来の微調整手法のパフォーマンスに匹敵するか、それを上回ることが示されています (オリジナルの結果を参照) LoRA 論文)。 また、トレーニングのスループットが向上するという利点もあります。 とは異なり、 アダプタ LoRA では、推論中に追加の遅延が発生しないため、展開フェーズ中のモデルの効率が維持されます。 LoRA を使用した Whisper の微調整は有望な結果を示しています。 たとえば、Whisper-Large-v2 を考えてみましょう。 3 GB メモリの GPU で 12 時間の共通音声データセットを使用して 8 エポックを実行するには 6 ~ 8 時間かかりますこれは、同等のパフォーマンスを持つ完全な微調整よりも 5 倍高速です。

アマゾンセージメーカー LoRA による Whisper の微調整を実装するための理想的なプラットフォームです。 Amazon SageMaker を使用すると、フルマネージド型のインフラストラクチャ、ツール、ワークフローを使用して、あらゆるユースケース向けの機械学習モデルを構築、トレーニング、デプロイできます。 モデル トレーニングの追加の利点としては、マネージド スポット トレーニングによるトレーニング コストの削減、モデルとトレーニング データセットを AWS GPU インスタンス間で分割するための分散トレーニング ライブラリ、および 他には?。 トレーニングされた SageMaker モデルは、推論のために SageMaker 上に直接簡単にデプロイできます。 この投稿では、SageMaker で LoRA 微調整を実装するためのステップバイステップのガイドを紹介します。 この実装に関連するソース コードは、次の場所にあります。 GitHubの.

微調整用のデータセットを準備する

微調整タスクには低リソース言語のマラーティー語を使用します。 の使用 ハグ顔データセット ライブラリを使用すると、Common Voice データセットをダウンロードして、トレーニング データセットとテスト データセットに分割できます。 次のコードを参照してください。

from datasets import load_dataset, DatasetDict language = "Marathi"
language_abbr = "mr"
task = "transcribe"
dataset_name = "mozilla-foundation/common_voice_11_0" common_voice = DatasetDict()
common_voice["train"] = load_dataset(dataset_name, language_abbr, split="train+validation", use_auth_token=True)
common_voice["test"] = load_dataset(dataset_name, language_abbr, split="test", use_auth_token=True)

ささやき音声認識モデルでは、オーディオ入力が次のとおりである必要があります。 16kHz モノラル 16 ビット符号付き整数 WAV ファイル。 Common Voice データセットは 48K サンプリング レートであるため、最初にオーディオ ファイルをダウンサンプリングする必要があります。 次に、Whisper の特徴抽出機能をオーディオに適用してログメル スペクトログラムの特徴を抽出し、Whisper のトークナイザーをフレーム化された特徴に適用してトランスクリプト内の各文をトークン ID に変換する必要があります。 次のコードを参照してください。

from transformers import WhisperFeatureExtractor
from transformers import WhisperTokenizer feature_extractor = WhisperFeatureExtractor.from_pretrained(model_name_or_path)
tokenizer = WhisperTokenizer.from_pretrained(model_name_or_path, language=language, task=task) def prepare_dataset(batch):
# load and resample audio data from 48 to 16kHz
audio = batch["audio"] # compute log-Mel input features from input audio array
batch["input_features"] = feature_extractor(audio["array"], sampling_rate=audio["sampling_rate"]).input_features[0] # encode target text to label ids
batch["labels"] = tokenizer(batch["sentence"]).input_ids
return batch #apply the data preparation function to all of our fine-tuning dataset samples using dataset's .map method.
common_voice = common_voice.map(prepare_dataset, remove_columns=common_voice.column_names["train"], num_proc=2)
common_voice.save_to_disk("marathi-common-voice-processed")
!aws s3 cp --recursive "marathi-common-voice-processed" s3://<Your-S3-Bucket>

すべてのトレーニング サンプルを処理した後、処理されたデータを Amazon S3 にアップロードします。これにより、微調整段階で処理されたトレーニング データを使用するときに、 高速ファイル S3 ファイルをローカル ディスクにコピーする代わりに直接マウントするには:

from sagemaker.inputs import TrainingInput
training_input_path=s3uri
training = TrainingInput(
s3_data_type='S3Prefix', # Available Options: S3Prefix | ManifestFile | AugmentedManifestFile
s3_data=training_input_path,
distribution='FullyReplicated', # Available Options: FullyReplicated | ShardedByS3Key
input_mode='FastFile'
)

モデルを訓練する

デモンストレーションのために、事前トレーニング済みモデルとして Whisper-large-v2 を使用します (Whisper v3 が利用可能になりました)。これは、Hugging Face トランスフォーマー ライブラリを通じてインポートできます。 使用できます 8ビット量子化 トレーニング効率をさらに向上させます。 8 ビット量子化は、浮動小数点から 8 ビット整数に丸めることによってメモリを最適化します。 これは、推論中の精度をあまり犠牲にすることなくメモリを節約するために一般的に使用されるモデル圧縮手法です。

事前トレーニングされたモデルを 8 ビット量子化形式でロードするには、次のコードに示すように、モデルをインスタンス化するときに、単にload_in_8bit=True 引数を追加します。 これにより、8 ビットに量子化されたモデルの重みがロードされ、メモリ フットプリントが削減されます。

from transformers import WhisperForConditionalGeneration model = WhisperForConditionalGeneration.from_pretrained(model_name_or_path, load_in_8bit=True, device_map="auto")

Hugging Face の LoRA 実装を使用します。 ペフト パッケージ。 LoRA を使用してモデルを微調整するには、次の XNUMX つの手順があります。

  1. (最後のステップで行ったように) 基本モデルをインスタンス化します。
  2. 構成を作成します (LoraConfig) ここで、LoRA 固有のパラメーターが定義されます。
  3. ベースモデルをラップします get_peft_model() トレーニング可能なものを取得する PeftModel.
  4. トレーニング PeftModel ベースモデルとして。

次のコードを参照してください。

from peft import LoraConfig, get_peft_model config = LoraConfig(r=32, lora_alpha=64, target_modules=["q_proj", "v_proj"], lora_dropout=0.05, bias="none")
model = get_peft_model(model, config) training_args = Seq2SeqTrainingArguments(
output_dir=args.model_dir,
per_device_train_batch_size=int(args.train_batch_size),
gradient_accumulation_steps=1,
learning_rate=float(args.learning_rate),
warmup_steps=args.warmup_steps,
num_train_epochs=args.num_train_epochs,
evaluation_strategy="epoch",
fp16=True,
per_device_eval_batch_size=args.eval_batch_size,
generation_max_length=128,
logging_steps=25,
remove_unused_columns=False,
label_names=["labels"],
)
trainer = Seq2SeqTrainer(
args=training_args,
model=model,
train_dataset=train_dataset["train"],
eval_dataset=train_dataset.get("test", train_dataset["test"]),
data_collator=data_collator,
tokenizer=processor.feature_extractor,
)

を実行するには SageMakerトレーニング 私たちは独自の Docker コンテナを導入しています。 Docker イメージは次からダウンロードできます。 GitHubのここで、ffmpeg4 と git-lfs は、他の Python 要件とともにパッケージ化されています。 独自の Docker コンテナを SageMaker で動作するように調整する方法の詳細については、以下を参照してください。 独自のトレーニング コンテナを調整する。 その後、Hugging Face Estimator を使用して、SageMaker トレーニング ジョブを開始できます。

OUTPUT_PATH= f's3://{BUCKET}/{PREFIX}/{TRAINING_JOB_NAME}/output/' huggingface_estimator = HuggingFace(entry_point='train.sh',
source_dir='./src',
output_path= OUTPUT_PATH,
instance_type=instance_type,
instance_count=1,
# transformers_version='4.17.0',
# pytorch_version='1.10.2',
py_version='py310',
image_uri=<ECR-PATH>,
role=ROLE,
metric_definitions = metric_definitions,
volume_size=200,
distribution=distribution,
keep_alive_period_in_seconds=1800,
environment=environment,
) huggingface_estimator.fit(job_name=TRAINING_JOB_NAME, wait=False)

LoRA の実装により、単一の GPU インスタンス (ml.g5.2xlarge など) で Whisper の大規模微調整タスクを実行できるようになりました。 比較すると、Whisper のラージ完全微調整タスクには複数の GPU (ml.p4d.24xlarge など) とはるかに長いトレーニング時間が必要です。 具体的には、私たちの実験では、完全な微調整タスクには LoRA アプローチと比較して 24 倍の GPU 時間が必要であることが実証されました。

モデルのパフォーマンスを評価する

微調整された Whisper モデルのパフォーマンスを評価するために、保持されたテスト セットで単語誤り率 (WER) を計算します。 WER は、予測されたトランスクリプトとグランド トゥルース トランスクリプト間の差異を測定します。 WER が低いほど、パフォーマンスが優れていることを示します。 事前トレーニングされたモデルと微調整されたモデルに対して次のスクリプトを実行し、それらの WER の違いを比較できます。

metric = evaluate.load("wer") eval_dataloader = DataLoader(common_voice["test"], batch_size=8, collate_fn=data_collator) model.eval()
for step, batch in enumerate(tqdm(eval_dataloader)):
with torch.cuda.amp.autocast():
with torch.no_grad():
generated_tokens = (
model.generate(
input_features=batch["input_features"].to("cuda"),
decoder_input_ids=batch["labels"][:, :4].to("cuda"),
max_new_tokens=255,
)
.cpu()
.numpy()
)
labels = batch["labels"].cpu().numpy()
labels = np.where(labels != -100, labels, tokenizer.pad_token_id)
decoded_preds = tokenizer.batch_decode(generated_tokens, skip_special_tokens=True)
decoded_labels = tokenizer.batch_decode(labels, skip_special_tokens=True)
metric.add_batch(
predictions=decoded_preds,
references=decoded_labels,
)
del generated_tokens, labels, batch
gc.collect()
wer = 100 * metric.compute()
print(f"{wer=}")

まとめ

この投稿では、最先端の音声認識モデルである Whisper の微調整をデモンストレーションしました。 特に、Hugging Face の PEFT LoRA を使用し、効率的なトレーニングのために 8 ビット量子化を有効にしました。 また、SageMaker でトレーニング ジョブを実行する方法も示しました。

これは重要な最初のステップですが、この作業を基にしてウィスパー モデルをさらに改善する方法がいくつかあります。 今後は、SageMaker 分散トレーニングを使用して、より大規模なデータセットでトレーニングを拡張することを検討してください。 これにより、より多様で包括的なデータに基づいてモデルをトレーニングできるようになり、精度が向上します。 また、Whisper モデルを提供するときに遅延を最適化して、リアルタイムの音声認識を有効にすることもできます。 さらに、より長い音声文字起こしを処理するために作業を拡張することもできますが、これにはモデル アーキテクチャとトレーニング スキームの変更が必要になります。

了承

著者らは、この投稿に対する洞察力に富んだフィードバックとレビューを提供してくれた Paras Mehra、John Sol、Evandro Franco に感謝の意を表します。


著者について

LoRA を使用して Amazon SageMaker で Whisper モデルを微調整する |アマゾン ウェブ サービス PlatoBlockchain データ インテリジェンス。垂直検索。あい。ジュンシ アマゾン ウェブ サービス (AWS) のシニア ソリューション アーキテクトです。 彼の現在の重点分野は、AI/ML インフラストラクチャとアプリケーションです。 彼はソフトウェア エンジニアとして FinTech 業界で XNUMX 年以上の経験があります。

LoRA を使用して Amazon SageMaker で Whisper モデルを微調整する |アマゾン ウェブ サービス PlatoBlockchain データ インテリジェンス。垂直検索。あい。博士 長沙馬 AWS の AI/ML スペシャリストです。 彼女はコンピューター サイエンスの博士号、教育心理学の修士号を取得した技術者であり、データ サイエンスと AI/ML の独立系コンサルティングで長年の経験があります。 彼女は、機械と人間の知能のための方法論的アプローチの研究に情熱を注いでいます。 仕事以外では、ハイキング、料理、食べ物探し、友人や家族と時間を過ごすことが大好きです。

タイムスタンプ:

より多くの AWS機械学習