すべてのプロダクト
Search
ドキュメントセンター

Platform For AI:Llama3-8Bモデルの微調整

最終更新日:Sep 18, 2024

Platform for AI (PAI) のData Science Workshop (DSW) は、カスタムモデルの微調整を実行し、モデルのパフォーマンスを最適化できるインタラクティブなモデリングプラットフォームです。 このトピックでは、DSWでLlama 3モデルのパラメーターを微調整して、モデルを特定のシナリオに適応させ、特定のタスクでモデルのパフォーマンスを向上させる方法について説明します。 このトピックでは、例としてMeta-Llama-3-8B-Instructモデルを使用します。

背景情報

ラマ3は、2024年4月にメタが提供したラマシリーズの最新モデルファミリーです。 ラマ3は15兆トークン以上でトレーニングされており、これはラマ2データセットの約7倍のサイズです。 Llama 3は、8Kトークンと、128Kトークンの語彙サイズを持つ改良されたトークナイザをサポートします。 これにより、複雑なコンテキストと専門用語のより正確で効率的な処理が保証されます。

Llama3は、さまざまなシナリオに適した8Bおよび70Bサイズのモデルの事前トレーニングおよび命令調整バージョンを提供します。

  • 8B

    ラマ3 8Bは、コンシューマーグレードのGPUに基づく効率的な展開と開発に適しています。 Llama 3 8Bは、高い応答速度と費用対効果が必要なシナリオで使用できます。

    • Meta-Llama-3-8B: pretrainedバージョン

    • Meta-Llama-3-8B-Instruct: instruction-tuned version

  • 70B

    Llama 3 70Bは、大規模なパラメータサイズを活用し、大規模なAIアプリケーション、高度で複雑なタスク、およびパフォーマンス最適化タスクに適しています。

    • Meta-Llama-3-70B: pretrainedバージョン

    • Meta-Llama-3-70B-Instruct: instruction-tuned version

前提条件

  • ワークスペースが作成済み。 詳細については、「ワークスペースの作成」をご参照ください。

  • DSWインスタンスが作成されます。 次の重要なパラメータに注意してください。 詳細については、「DSWインスタンスの作成」をご参照ください。

    • インスタンスタイプ: V100 GPUなど、GPUメモリが16 GB以上のインスタンスを使用することを推奨します。

    • Python: Python 3.9以降。

    • イメージ: この例では、次のイメージURLが使用されます: dsw-registry-vpc。 REGIONを、DSWインスタンスが存在するリージョンのIDに置き換えます。 例: cn-hangzhouまたはcn-shanghai。 次の表に、リージョンIDを示します。

      リージョン

      リージョン ID

      中国 (杭州)

      cn-hangzhou

      中国 (上海)

      cn-shanghai

      中国 (北京)

      cn-beijing

      中国 (深セン)

      cn-shenzhen

  • Llama 3モデルを使用する前に、公式Metaライセンスをお読みください。

    説明

    webページにアクセスできない場合は、プロキシを設定して再試行してください。

ステップ1: モデルをダウンロード

方法1: DSWでモデルをダウンロード

  1. DSW開発環境に移動します。

    1. PAIコンソールにログインします。

    2. 上部のナビゲーションバーで、DSWインスタンスが存在するリージョンを選択します。

    3. 左側のナビゲーションペインで、[ワークスペース] をクリックします。 [ワークスペース] ページで、デフォルトのワークスペースの名前をクリックします。

    4. 左側のナビゲーションウィンドウで、[モデルの開発とトレーニング] > [インタラクティブモデリング (DSW)] を選択します。

    5. 管理するDSWインスタンスの [操作] 列で [開く] をクリックして、DSWインスタンスの開発環境に移動します。

  2. [ランチャー] タブで、[クイックスタート] セクションの [ノートブック] ペインで [Python 3] をクリックします。

  3. ノートブックで次のコードを実行して、モデルファイルをダウンロードします。 システムは自動的に適切なダウンロードアドレスを選択し、モデルファイルを現在のディレクトリにダウンロードします。

    ! pip install modelscope==1.12.0 transformers==4.37.0
    from modelscope.hub.snapshot_download import snapshot_download
    snapshot_download('LLM-Research/Meta-Llama-3-8B-Instruct', cache_dir='.', revision='master')

方法2: Metaでモデルをダウンロードする

Meta Webサイトにアクセスして、モデルを申請します。

説明

webページにアクセスできない場合は、プロキシを設定して再試行してください。

手順2: データセットの準備

この例では、英語の詩データセットを使用してラマ3モデルを微調整し、生成された詩の詩的表現力を向上させます。 DSWのノートブックで次のコマンドを実行して、モデルに必要なトレーニングデータセットをダウンロードします。

!wget https://atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com/tutorial/llm_instruct/en_poetry_train.json

サンプルトレーニングデータセットの形式に基づいて、ビジネスシナリオに適したデータセットを使用できます。 LLMを微調整することで、特定のタスクに対するLLMの応答精度を向上させることができます。

ステップ3: モデルの微調整

軽量LoRAトレーニング

この例では、/ml/code/sft.pyトレーニングスクリプトを使用して、モデルの軽量低ランク適応 (LoRA) トレーニングを実行します。 トレーニング後、システムはモデルパラメータを量子化して、推論に必要なGPUメモリを削減します。

accelerate launchコマンドを実行すると、システムはパラメーターを使用して特定のPythonスクリプトを起動し、multi_gpu.yaml構成ファイルで指定されたコンピューティングリソースに基づいてトレーニングを実行します。

! accelerate launch --num_processes 1 --config_file /ml/code/multi_gpu.yaml /ml/code/sft.py \
    --model_name  ./LLM-Research/Meta-Llama-3-8B-Instruct/ \
    --model_type llama \
    --train_dataset_name chinese_medical_train_sampled.json \
    --num_train_epochs 3 \
    --batch_size 8 \
    --seq_length 128 \
    --learning_rate 5e-4 \
    --lr_scheduler_type linear \
    --target_modules k_proj o_proj q_proj v_proj \
    --output_dir lora_model/ \
    --apply_chat_template \
    --use_peft \
    --load_in_4bit \
    --peft_lora_r 32 \
    --peft_lora_alpha 32 

次のセクションでは、この例で使用されるパラメーターについて説明します。 ビジネス要件に基づいてパラメーターを変更します。

  • accelerate launchコマンドは、複数のGPUで深層学習トレーニングスクリプトを起動および管理するために使用されます。

    • num_processes: 並列プロセスの数。 この例では、このパラメーターを1に設定して、マルチプロセス並列処理を無効にします。

    • config_file/ml/code/multi_gpu.yaml: 設定ファイルのパス。

    • /ml/code/sft.py: 実行するPythonスクリプトのパス。

  • /ml/code/sft.pyスクリプトを実行するには、次のパラメーターを設定します。

    • --model_name./LLM-Research/Meta-Llama-3-8B-Instruct/: 事前トレーニング済みモデルのパス。

    • -- model_type: モデルの型。 この例では、Llamaが使用されます。

    • -- train_dataset_namechinese_medical_train_sampled.json: トレーニングデータセットのパス。

    • -- num_train_epochs: トレーニングエポックの数。 この例では、パラメーターを3に設定します。

    • -- batch_size: バッチのサイズ。 この例では、パラメーターを8に設定します。

    • -- seq_length: シーケンスの長さ。 この例では、パラメーターを128に設定します。

    • -- learning_rate: 学習率。 この例では、パラメーターを5e-4に設定します。これは0.0005に等しくなります。

    • -- lr_scheduler_type: 学習レートスケジューラのタイプ。 この例では、パラメーターをlinearに設定します。

    • -- target_modules: 微調整中にフォーカスするモデルセクション。 この例では、パラメーターをk_proj o_proj q_proj v_projに設定します。

    • -- output_dir: 微調整されたモデルが保存されている出力ディレクトリ。 この例では、パラメーターをlora_model /に設定します。

    • -- apply_chat_template: トレーニング中に使用するチャットテンプレート。

    • -- use_peft: トレーニング中にパラメータ効率微調整 (PEFT) を使用する。

    • -- load_in_4bit: メモリ消費を減らすために4ビット精度でモデル重みをロードします。

    • _peft_lora_r 32: LoRAがパラメータ効率調整方法の一部として使用される場合、これはLoRAに対して32の値を指定する。

    • -- peft_lora_alpha: LoRAのアルファ値。 この例では、パラメーターを32に設定します。

LoRA重みをモデルに融合

次のコマンドを実行して、LoRA重みをLlama 3モデルに融合します。

! RANK=0 python /ml/code/convert.py \
    --model_name ./LLM-Research/Meta-Llama-3-8B-Instruct/ \
    --model_type llama \
    --output_dir trained_model/ \
    --adapter_dir lora_model/

次のセクションでは、この例で使用されるパラメーターと値について説明します。

  • RANK=0: RANK環境変数は、分散トレーニングのすべてのプロセスのうち、現在のプロセスのシーケンス番号を指定するために使用されます。 値0は、現在のプロセスが独立したプロセスであるか、分散トレーニングのメインプロセスとして機能することを示します。

  • python /ml/code/convert.py: 重み変換またはその他の変換タスクのためにconvert.pyスクリプトを実行します。

  • -- model_name。/LLM-リサーチ /Meta-Llama-3-8B-Instruct/:モデルへのパス。

  • -- model_type llama: モデルの型。 この例では、Llamaが使用されます。

  • -- output_dir train ed_model/: 変換されたモデルと重みが保存される出力ディレクトリ。

  • -- adapter_dir lora_model/: LoRAアダプタの重みがあるディレクトリ。

ステップ4: モデル推論の実行

次のコマンドを実行してモデル推論を実行し、微調整効果を確認します。 この例では、春についての詩を生成するためにモデルが必要です。

import torch, transformers

# model_id = "./LLM-Research/Meta-Llama-3-8B-Instruct/"
model_id = "./trained_model/"
pipeline = transformers.pipeline(
    "text-generation",
    model=model_id,
    model_kwargs={"torch_dtype": torch.bfloat16},
    device="cuda",
)

messages = [
    {"role": "user", "content": "Write a poem on a topic 'spring' "},
]

prompt = pipeline.tokenizer.apply_chat_template(
        messages, 
        tokenize=False, 
        add_generation_prompt=True
)

terminators = [
    pipeline.tokenizer.eos_token_id,
    pipeline.tokenizer.convert_tokens_to_ids("<|eot_id|>")
]

outputs = pipeline(
    prompt,
    max_new_tokens=1024,
    eos_token_id=terminators,
    do_sample=True,
    temperature=0.6,
    top_p=0.9,
)
print(outputs[0]["generated_text"][len(prompt):])

次のセクションでは、モデルが微調整後に高品質の詩を生成できることを示すサンプルモデル応答を提供します。

Here's a poem on the topic of "Spring":

As winter's chill begins to fade,
The earth awakens from its shade,
And spring's sweet breath begins to blow,
Bringing life to all that's cold and slow.

The trees regain their vibrant hue,
And flowers bloom, both old and new,
Their petals dancing in the breeze,
As sunshine warms the world with ease.

The air is filled with sweet perfume,
As blossoms burst forth in their room,
And robins sing their morning song,
As spring's awakening is strong.

The world is fresh, and new, and bright,
As spring's warm light begins to take flight,
And all around, new life unfolds,
As winter's grip begins to grow old.

So let us bask in spring's warm rays,
And let our spirits soar and sway,
For in this season, we're reborn,
And all around, new life is sworn.

I hope you enjoy it!

ステップ5。 モデルのデプロイDeploy the model

微調整されたモデル重みをObject Storage Service (OSS) にアップロードし、微調整されたLlama 3モデルをPAIのElastic Algorithm Service (EAS) にデプロイできます。 詳細については、「EASでのLLMアプリケーションのデプロイ」をご参照ください。

付録: DSWギャラリーでラマ3を使用する

DSWギャラリーは、ラマ3のノートブックのユースケースを提供します。 このケースは、ビジネス要件に基づいてDSWインスタンスで使用できます。 詳細については、「ノートブックギャラリー」をご参照ください。

関連ドキュメント

ChatLLM-WebUIのバージョンの詳細については、「ChatLLM WebUIのリリースノート」をご参照ください。