データ・サイエンスおよびAIクイック・アクションを使用したGPUでのオープン・ソースLLMの微調整およびデプロイ

はじめに

このチュートリアルでは、Oracle Cloud Infrastructure (OCI)データ・サイエンス・サービスを使用して、データ・サイエンスによって提供されるAIクイック・アクション機能を使用してオープンソースのLLMを微調整する方法について説明します。ポイント・アンド・クリックで簡単に、AIクイック・アクションを使用して、Hugging Faceが提供するMistral LLMを微調整します。そのLLMは、NVIDIAが公開したFAQに基づいて微調整されます。その後、AIクイック・アクションを使用して、そのチューニング済モデルをA10 GPUシェイプにデプロイします。その後、Jupyterノートブックで実行されているPythonコードを使用して、チューニングされたモデルの出力に、NVIDIAトレーニング・データに似た希望のスタイルとトーンがあることを示します。

目的

前提条件

タスク1: データ・サイエンス・ノートブック・セッションのプロビジョニング

  1. OCIコンソールを使用して、データ・サイエンス・プロジェクトを作成します。

  2. そのプロジェクトに移動し、2つ以上のECPUを持つデータ・サイエンス・ノートブック・セッションを作成します。

  3. そのノートブック・セッションを開き、「拡張」をクリックします。

  4. データ・サイエンスでターミナル・セッションを開始します。

  5. このチュートリアルで使用するJupyterノートブックを含むgithubリポジトリをクローニングするには、そのターミナルを使用します。

    git clone https://github.com/oracle-nace-dsai/quick-actions-demo-archive.git
    
  6. NVIDIAのクローンに関するFAQ:

    git clone https://huggingface.co/datasets/ajsbsd/nvidia-qa
    
    
  7. 最初のリポジトリのデータ・ディレクトリにNVIDIA FAQをコピーします。

    cp nvidia-qa/NvidiaDocumentationQandApairs.csv quick-actions-demo-archive/data/.
    
    
  8. General Machine Learning for CPUs on Python 3.11 condaをインストールしてアクティブ化します:

    odsc conda install -s generalml_p311_cpu_x86_64_v1 
    conda activate /home/datascience/conda/generalml_p311_cpu_x86_64_v1
    
  9. https://github.com/oracle-samples/oci-data-science-ai-samples/blob/main/ai-quick-actions/model-deployment-tips.md#using-python-sdk-without-streamingごとにLangChainをインストールします。

    pip install langgraph "langchain>=0.3" "langchain-community>=0.3" "langchain-openai>=0.2.3" "oracle-ads>2.12"
    

タスク2: Hugging Faceアカウントの設定

  1. https://huggingface.co.でHugging Faceアカウントを作成します

  2. Hugging Faceアカウント→「アクセス・トークン」にナビゲートし、次の権限をチェックした新しいユーザー・アクセス・トークンを作成します。

    • 個人名前空間の下にあるすべてのリポジトリのコンテンツに対する読取りアクセス
    • アクセスできるすべての公開ゲート付きリポジトリのコンテンツに対する読取りアクセス
  3. データ・サイエンス・ターミナル・セッションを使用して、Hugging Faceでユーザー・アクセス・トークンを記録します:

    git config --global credential.helper store
    huggingface-cli login
    
    

タスク3: オブジェクト・ストレージ・バケットの作成

データ・サイエンス・ノートブックと同じリージョンおよびコンパートメントにオブジェクト・ストレージ・バケットを作成します。

タスク4: ロギングの設定

ログ・グループの作成、カスタム・ログの作成

タスク5: データ・サイエンスのAIクイック・アクションを使用したA10 GPUシェイプへのLLMの導入(ファインチューニングなし)

  1. データ・サイエンス・ノートブック > ランチャ > AIクイック処理にナビゲートします

    a.Mistralモデルを検索します
    b.mistralai/Mistral-7B-Instruct-v0.3タイル
    cをクリックします。前述のログが選択された状態で「デプロイ」をクリックします

  2. モデル・デプロイメントには約15分かかります。「端末でログを開く」を選択して、デプロイメント・ログを監視できます。

  3. モデルのデプロイメントが完了したら、「デプロイメント」「ただデプロイしたモデル」「モデルのテスト」に移動し、次のような単純な質問でそのモデルを再生テストします。

    Who wrote the Harry Potter book series?
    
    
  4. 単純なLLMの中には、次のテスト質問に正しく回答できないものもありますが、Mistral-7B-Instruct-v0.3は、これらの質問に答えるというかなりの良い仕事をしています。

    A bat and a ball cost $1.10 in total. The bat costs $1.00 more than the ball. How much does the ball cost?
    Every cat has four legs. My pet has four legs. Is my pet a cat?
    Who is President of the United States? 
    

タスク6: デプロイ済モデルのエンドポイントとの対話

  1. 「デプロイメント」「ただデプロイしたモデル」「モデルの起動」にナビゲートして、デプロイしたモデルのエンドポイントを確認します。次に、データ・サイエンス・ターミナルを使用して、そのエンドポイントをシェル変数として格納します。たとえば:

    endpoint=https://modeldeployment.<region>.oci.customer-oci.com/<model_ocid>/predict
    
  2. デプロイされたモデルのエンドポイントにプロンプトを送信します。

    prompt="Who is President of the United States?"
    request_body='{"model":"odsc-llm","prompt":"'$prompt'","max_tokens":100,"temperature":0.1,"top_k":50,"top_p":0.99,"stop":[],"frequency_penalty":0,"presence_penalty":0}'
    oci raw-request --http-method POST --target-uri $endpoint --request-body "$request_body" --auth resource_principal
    
  3. このbashループを使用して、モデルのエンドポイントを100回10秒でコールします。

    for i in $(seq 1 100); do
         oci raw-request --http-method POST --target-uri $endpoint --request-body "$request_body" --auth resource_principal &
         echo $i
         sleep 0.1
      done
    
    
  4. 「デプロイメント」「デプロイしたばかりのモデル」「ログ」にナビゲートして、モデルのエンドポイントに送信されたトラフィックを表示します。

img.png

図log_traffic.pngの説明

タスク7: AIクイック・アクションを使用したLLMの微調整

前のタスクでは、微調整なしでMistral LLMをデプロイしました。このタスクでは、同じLLMを微調整してデプロイします。タスク9では、チューニング済および未チューニングの両方のモデルの出力を比較します。このタスクと次のタスクでは、このコード・アーカイブからダウンロードされた2つのJupyterノートブックも使用します。

  1. データ・サイエンス・ノートブックのファイル・ブラウザを使用して、quick-actions-demo-archiveフォルダに移動し、prep_data.ipynb Jupyterノートブックを開きます。

  2. generalml_p311_cpu_x86_64_v1カーネルを選択します。

  3. ノートブックの2番目から最後の段落を、テナンシ/ネームスペースおよびオブジェクト・ストレージ・バケットを参照するように改訂します。

  4. 次の処理を行うprep_data.ipynb Jupyterノートブックを実行します。

    • ファイルdata/NvidiaDocumentationQandApairs.csvからNVIDIA FAQを読みます
    • CSV FAQを、AIクイック・アクションで想定されるpromptおよびcompletionフィールドを持つJSONレコードとして再キャストします。
    • そのデータの90:10の分割をtrain:testサンプルに実行します。
    • トレーニング・サンプルをオブジェクト・ストレージのファイルquick_actions/tuning_data/tune_sample.jsonlにプッシュします。
  5. 「AIクイック処理」「モデル」mistralai/Mistral-7B-Instruct-v0.3にナビゲートします。次に、次の設定で「ファインチューニング」をクリックします。

    • オブジェクト・ストレージ・パス= quick_actions/tuning_data/tune_sample.jsonl
    • 検証分割= 20%
    • resultsオブジェクト・ストレージ・パス= quick_actions/tuning_results
    • シェイプ= BM.GPU.A10.4 (可用性が存在する場合)。それ以外の場合は、10.2または10.1シェイプを使用します
    • ログ・グループおよびログを選択します
  6. 次の設定で「拡張構成の表示」を有効にします:

    • batch_size = 64
    • sequence_len = 256
    • learning_rate = 0.000025
    • epochs = 12
  7. ファインチューニングはA10.2で約60分かかるため、「端末でログを開く」をクリックしてファインチューニング・ジョブのログを監視します。

  8. 「メトリック」セクションで、ファインチューニング・モデルの学習曲線を表示します。適切にチューニングされたモデルには、エポックの増加に伴って下降し、次に高原となる検証損失曲線があります。 img.png

図learning_curve.pngの説明

タスク8: ファインチューニングLLMのデプロイ

  1. 次の設定で、「AIクイック処理」「ファインチューニング・モデル」「ジャストチューニング・モデル」「デプロイ」にナビゲートします。

    • 計算シェイプ= VM.GPU.A10.1
    • ログ・グループおよびログを選択します
  2. 「端末でログを開く」をクリックして、デプロイメント・ログをモニターします

タスク9: ファインチューニングLLMのデプロイメントのテスト

  1. モデル・デプロイメントの完了後、「デプロイメント」「ジャスト・チューニング・モデル」「モデルのテスト」にナビゲートし、prep_data.ipynbノートブックに表示されるテスト・サンプル質問からの質問を使用してプレイテストします。次に例を示します。

    What benefits does Unified Memory bring to complex data structures and classes?
    
    
  2. モデルのエンドポイントをコピーして、端末セッションのシェル変数に貼り付けます。

    endpoint=https://modeldeployment.<region>.oci.customer-oci.com/<model_ocid>/predict
    
  3. デプロイされたモデルのエンドポイントにプロンプトを送信します。

    prompt="What benefits does Unified Memory bring to complex data structures and classes?"
    request_body='{"model":"odsc-llm","prompt":"'$prompt'","max_tokens":100,"temperature":0.1,"top_k":50,"top_p":0.99,"stop":[],"frequency_penalty":0,"presence_penalty":0}'
    oci raw-request --http-method POST --target-uri $endpoint --request-body "$request_body" --auth resource_principal
    
  4. このbashループを使用して、モデル・エンドポイントを100回コールします:

    for i in $(seq 1 100); do
       oci raw-request --http-method POST --target-uri $endpoint --request-body "$request_body" --auth resource_principal &
       echo $i
       sleep 0.1
    done
    
  5. ファインチューニング/デプロイされたモデルの「ログ」をクリックして、そのモデルのエンドポイントへの最近のトラフィックを表示します。

  6. compare_models.ipynb Jupyterノートブックを開き、段落[8]を更新して、チューニングおよびアンチューニングされた2つのモデルのエンドポイントを参照します。

  7. 次の処理を行うノートブックを実行します。

    • FAQレコードのテスト・サンプルをお読みください。
    • pythonを使用して、5つのテスト質問をファインチューニング・モデルとアンチューニング・モデルのエンドポイントにフィードし、それらのレスポンスを比較します。
    • pythonを使用してデプロイされたモデルのエンドポイントを呼び出す方法を示す段落[10]に注意してください。これは非常に簡単です。 img.png

      図call_endpoint.pngの説明

  8. このテストの主な結果を確認します。

    • 微調整されたLLMの応答には、実際のNVIDIAが組み立てたFAQの回答とかなり似たトーン、スタイル、長さがあります。
    • チューニングされていないLLMのレスポンスははるかに詳細であり、不正確である可能性が高い多数の無関係な文が含まれています。
    • ファインチューニングLLMとアンチューニングLLMの応答は、多くの場合、正しくなく、同様に正しくありません。
    • より大きなデータセットで微調整すると、その応答の精度が向上する可能性があります。

タスク10: リソースの削除

  1. 「AIクイック処理」「デプロイメント」にナビゲートし、モデル・デプロイメントを削除します。

  2. 「AIクイック処理」「モデル」「ファインチューニング・モデル」にナビゲートして削除します。

  3. OCIコンソール・ページを使用して、データ・サイエンス・ノートブック・セッションに移動し、終了します。

  4. 「ジョブ」をクリックし、ファインチューニング・ジョブを削除します。

  5. データ・サイエンス・プロジェクトを削除します。

  6. OCIコンソール・ページを使用して、オブジェクト・ストレージ・バケットに移動して削除します。

  7. OCIコンソールを使用して、ログおよびログ・グループを削除します。

確認

その他の学習リソース

docs.oracle.com/learnで他のラボを確認するか、Oracle Learning YouTubeチャネルで無料のラーニング・コンテンツにアクセスしてください。また、education.oracle.com/learning-explorerにアクセスして、Oracle Learning Explorerになります。

製品ドキュメントについては、Oracle Help Centerを参照してください。