ノート:

Oracle Cloud Infrastructure GPUへのLlama2のデプロイ

イントロダクション

LLAMA2は、リソースが制約されたデバイスで機械学習モデルを効率的にスケーリングするように設計された最先端のディープ・ラーニング・アーキテクチャです。このプラットフォームは非常にスケーラブルで適応性が高いため、組織は膨大な量のデータを簡単に処理し、有意義なインサイトを引き出し、変化する市場状況に迅速に対応できます。Llama2の主な機能の1つは、データをほぼリアルタイムで処理する機能です。これにより、企業は環境の変化に迅速に対応できます。さらに、Apache Kafka、Apache Flink、Apache Sparkなど、様々なデータ・ソースおよび処理フレームワークをサポートしています。つまり、開発者は特定のニーズに最適なツールを選択できます。

Llama2には、ストリーミングSQLのサポート、HadoopやYARNなどの一般的なビッグ・データ・ツールとの統合、データのプライバシと整合性を確保するための強力なセキュリティ対策など、他の多くの便利な機能もあります。全体として、Llama2は、組織が大規模なデータセットを効率的に処理して分析するのに役立つ強力なツールであり、ペースの速い今日のデジタル環境で競争力を発揮します。

アーキテクチャは、人間に似た応答を生成するために連携する複数のコンポーネントで構成されます。モデルのコアはトランスフォーマ・エンコーダで、一連の単語またはテキストを取り込み、入力を表す一連のベクトルを出力します。これらのベクトルは、フィードフォワード・ニューラル・ネットワーク(FFNN)および残余接続のレイヤーを介して渡され、最終的な出力が生成されます。

FFNNは、入力シーケンスを処理し、コンテキスト化された埋込みを生成する、完全に接続されたレイヤーで構成されています。残存接続により、モデルはデータ内のより複雑なパターンを学習し、全体的なパフォーマンスを向上させることができます。

これらのコア・コンポーネントに加えて、Llama LLMには、モデルの微調整と精度の向上に役立つ他のモジュールも含まれています。これには、テキスト入力を数値トークンに変換するトークン化子、学習したサブワードを格納する語彙、トレーニング中の露出バイアスを防ぐためのマスクが含まれます。

テキスト生成WebUIは、大規模言語モデルのためのgradio Web UIです。APIおよびコマンドライン・ツールもサポートしています。このWebUIは、トランスフォーマ、llama.cpp、ExLlama、ExLlamaV2、AutoGPTQ、GPTQ-for-Llama、CTransformersおよびAutoAWQを含む複数のモデル・バックエンドをサポートしています。また、LoRAモデル、微調整、QLoRAを使用した新しいLoRAのトレーニングもサポートします。モデルのお気に入りの拡張機能をロードするための拡張機能フレームワークがあります。OpenAI互換APIサーバーがあります。

目的

前提条件

タスク1: OCIでのGPUコンピュート・インスタンスのプロビジョニング

  1. パブリック・サブネットを持つ既存のVCNを使用して、OCIでコンピュート・インスタンスを起動します。詳細は、コンピュート・インスタンスの起動を参照してください。

  2. 使用可能なGPU.A10シェイプから1つを選択します。

    VM.GPU.A10.1
    VM.GPU.A10.2
    BM.GPU.A10.4
    
  3. コンピュート・インスタンスを起動するときに、シェイプを前述のシェイプのいずれかに変更します。

  4. テナンシにGPU.A10のサービス制限が設定されていない場合、これらのシェイプはシェイプ・リストにありません。

    • OCIコンソールでテナンシ制限を確認するには、GPU.A10コンピュート・インスタンスをプロビジョニングするリージョンを設定し、ナビゲーション・メニューを開いて「ガバナンスと管理」をクリックします。

    • 「テナンシ管理」で、「制限、割当ておよび使用状況」を選択します。

    • 「サービス」Computeを選択し、スコープ・フィールドで可用性ドメインのいずれかを選択し、リソース・フィールドにGPU.A10と入力します。

    • A10ベースのVMおよびBMインスタンスのGPUを選択します

      Image1

  5. コンピュート制限は可用性ドメインごとです。リージョンの可用性ドメインのいずれかに制限が設定されているかどうかを確認します。すべての可用性ドメインのサービス制限が0に設定されている場合は、「サービス制限の引上げのリクエスト」リンクをクリックし、このリソースに対する制限の引上げリクエストを送信します。

    ノート: 制限、割当ておよび使用状況にアクセスするには、テナンシ管理者グループのメンバーであるか、LimitsAndUsageViewersを読み取るためのポリシーが割り当てられている必要があります。

  6. 現在、OCI GPU.A10コンピュート・シェイプは、Oracle Linux、UbuntuおよびRocky Linuxをサポートしています。Windowsは、VMシェイプでのみサポートされています。

    ノート: Rocky Linuxは、NVIDIAでは公式にサポートされていません。

  7. OCIでコンピュート・インスタンスをプロビジョニングする場合は、標準のOSイメージまたはGPU対応イメージを使用します。標準のOSイメージを使用する場合は、NVIDIA vGPUドライバをインストールする必要があります。

    Image2

  8. ブート・ボリュームのセクションを展開して、ブート・ボリュームを少なくとも250GBに増やし、VPUを「より高いパフォーマンス」に増やして、適切な読取り/書込みを行い、より適切に推論できるようにします。

    BootVolume

    前述のパラメータを使用してインスタンスを起動します。

タスク2: Llama2の前提条件のインストール

  1. NVIDIAドライバはOracle Linux GPUビルド・イメージに含まれているため、NVIDIA-smiコマンドを実行して、その存在と機能を確認できます。これにより、すべてが正しく設定され、GPUドライバが期待どおりに機能するようになります。

    nvidia_smi

  2. FileSystemの増加: OCIインスタンスのシステム・メモリーには、デフォルトで46.6GBが付属しています。ブート・ボリュームを300GBに増やしたため、OCIユーティリティから構築されたOCIコマンドでファイル・システムを拡張しましょう。

    ブート・ボリュームを300GBに増やした後にOCIインスタンス上のファイル・システムを拡張するには、組込みのOCIコマンドを使用できます。次のステップに従います。

    • 現在のディスク使用量の確認: ファイル・システムのサイズを変更する前に、現在のディスク使用量を確認して、増加したブート・ボリューム・サイズを反映させることをお薦めします。この目的のためにdfコマンドを使用できます。使用可能な領域が新しいブート・ボリューム・サイズ(300GB)と一致することを確認します。

      bash df -h
      
    • ファイル・システムのサイズ変更: OCIユーティリティ・コマンドを使用して、増加したストレージを使用するようにファイル・システムのサイズを変更します。正確なコマンドは、使用している特定のOSおよびファイルシステムによって異なります。次は、Oracle Linux 8で使用されます。

      sudo /usr/libexec/oci-growfs
      

      パーティションの拡張の確認を求められたら、yと入力します。

    • ファイル・システムの拡張の確認: サイズ変更コマンドを実行した後、ディスク使用量を再度確認して、ファイル・システムが正常に展開されたことを確認します。

      bash df -h
      

    これで、増加したファイル・システム・サイズが反映されます。これらのステップに従うことで、増加したブート・ボリュームによって提供される追加のストレージ領域を利用するために、OCIインスタンス上のファイル・システムを拡張できるようになります。

    growfs

  3. 次のコマンドを使用して、Oracle Linux 8Python 3.10.6をインストールします。

    sudo dnf update -y
    sudo dnf install curl gcc openssl-devel bzip2-devel libffi-devel zlib-devel wget make -y
    wget https://www.python.org/ftp/python/3.10.6/Python-3.10.6.tar.xz
    tar -xf Python-3.10.6.tar.xz
    cd Python-3.10.6/
    ./configure --enable-optimizations
    make -j 2
    nproc
    sudo make altinstall
    python3.10 -V
    
  4. gitをインストールして、gitリポジトリをクローニングします。

    sudo dnf install git
    
  5. 次のコマンドを使用して、condaをインストールします。

    mkdir -p ~/miniconda3
    wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh
    bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3
    rm -rf ~/miniconda3/miniconda.sh
    ~/miniconda3/bin/conda init bash
    
  6. conda環境を作成します。

    conda create -n llama2 python=3.10.9 # llama2 being the conda environment name
    conda activate llama2
    
  7. 次のコマンドを使用して、PyTorch 2.0をインストールします。

    pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
    
  8. text-generation-webuiをクローニングします。クローン・ディレクトリにtext-generation-webuiリポジトリが必要です。

    git clone https://github.com/oobabooga/text-generation-webui
    
  9. requirements.txtをインストールし、ディレクトリをtext-generation-webuiに変更して、次のコマンドを実行します。

    pip3 install -r requirements.txt
    
  10. ポート7860トラフィックを許可するようにファイアウォール・ルールを更新します。

    sudo firewall-cmd --list-all # To check existing added ports
    sudo firewall-cmd --zone=public --permanent --add-port 7860/tcp
    sudo firewall-cmd --reload
    sudo firewall-cmd --list-all # Confirm that port has been added.
    

タスク3: Llama2の実行

  1. 前提条件が正常にインストールされると、text-generation-webuiを実行して前進する準備が整います。text-generation-webuiディレクトリに移動し、次のコマンドを実行します。

    python server.py --sdp-attention --listen
    

    このプロセスの結果は、必須モジュールをロードし、ポート7860で推論サーバーを起動する必要があります。

    llama2run

  2. 前述のように、ポート7860で実行されているサーバーでの正常なデプロイメントを確認した後、text-generation-webuiアプリケーションへのアクセスに進みます。Webブラウザを開き、http://<PublicIP>:7860というアドレスを入力し、<PublicIP>をインスタンスのパブリックIPアドレスに置き換えます。

    アプリケーションがロードされ、次に示すように表示されます。強調表示されているとおり、上部にあるセクション・モデルにナビゲートします。

    ウェブアプリ

  3. 「モデル」セクションで、目的のLlama2モデルのhuggingfaceリポジトリを入力します。当社では、huggingface repo TheBloke/Llama-2-13B-chat-GPTQからGPTQモデルを選択しました。モデルをダウンロードし、モデル・セクションにロードします。

    ダウンロードモデル

  4. ロードしたら、「チャット」セクションに移動して、Llama2を使用してテキスト生成を開始します。

    llama2demo

タスク4: Service Manager systemctlを介したテキスト生成WebUIのデプロイ

  1. パス/etc/systemd/systemにファイルllama2.serviceを作成し、次のテキストを入力します。

    [Unit]
    Description=systemd service start llama2
    
    [Service]
    WorkingDirectory=/home/opc/text-generation-webui
    ExecStart=bash /home/opc/text-generation-webui/start.sh
    User=opc
    [Install]
    WantedBy=multi-user.target
    
  2. 作業ディレクトリは必ず変更してください。ここでは、実行ファイルとしてstart.shについて説明し、text-generation-webuiディレクトリにそのファイルを作成し、次のテキストを入力します。

    #!/bin/sh
    # - the script is ran via anaconda python
    # - output is not buffered (-u)
    # - stdout & stderr are stored to a log file
    # - we're executing the working directory specified in the systemd service file
    /home/opc/miniconda3/envs/llama2/bin/python server.py --sdp-attention --listen
    
  3. これにより、常にconda環境Llama2が使用されます。systemdサービスからconda環境をアクティブ化することは望ましくありません。したがって、シェル・スクリプトを使用してアプリケーションを起動してから、シェル・スクリプトを使用してアプリケーションを実行します。次のコマンドを実行して、サービスをリロードし、有効化/起動します。

    sudo systemctl daemon-reload
    sudo systemctl enable llama2.service
    sudo systemctl start llama2.service
    
  4. 次のコマンドを実行して、サービスのステータスを確認します。

    sudo systemctl start llama2.service
    

確認

その他の学習リソース

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

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