本記事の作成者:JV Roig
Alibaba Cloud で生成 AI サービスをデプロイして使用するには、3 つの一般的な方法があります。
• IaaS (Infrastructure as a Service)
• PaaS (Platform as a Service)
• MaaS (Model as a Service)
パート 1 では、最初の方法である IaaS を扱います。
IaaS でデプロイする場合の主なメリットは、スタック全体を 100% 制御できることです。 スタックには以下を含みます。
• オペレーティングシステム
• インスタンスのタイプとサイズ
• LLM サーバーソフトウェア (Hugging Face、vLLM、llama.cpp など)
• モデルの選択 (任意のモデルを選択可能)
また、生成 AI スタックと同じ VM に存在する他のアプリケーションやソフトウェアも簡単に制御できます。
これは驚くべきことに聞こえるかもしれません (確かにその通りです) が、古い格言にもあるように、「大いなる力には、大いなる責任が伴う」ものです。
IaaS でのデプロイには、膨大な管理の手間が伴います。 以下のような、非常に多くの作業に責任を負うことになります。
• OS のセキュリティ、パッチ、メンテナンス
• LLM サーバーソフトウェアのセキュリティ、パッチ、メンテナンス
• パフォーマンスのスケーリングと負荷分散インフラストラクチャ
生成 AI に特定のアプローチで既に投資している場合 (たとえば、既に llama.cpp を使用して生成 AI 機能をデプロイする専門家である場合) は、IaaS での生成 AI のデプロイはお客様のユースケースに最適です。 スタック全体を管理する必要がありますが、必要な柔軟性を100% 得ることができます。
それでは、IaaS アプローチによる生成 AI のデプロイを始めましょう。
ここでの主役となるサービスはもちろん、Alibaba Cloud の主力 IaaS サービスである Elastic Compute service (ECS) です。
具体的には、GPU を備えたインスタンスを使用して、推奨される OS および生成 AI プラットフォームをホストします。
このチュートリアルでは、テクノロジーの主要な選択肢は以下の通りです。
• オペレーティングシステムは Ubuntu 22.04 LTS (NVIDIA CUDA との互換性が高い)
• LLM サーバーソフトウェアは llama.cpp (コミュニティ github ページ:https://github.com/ggerganov/llama.cpp を参照)
• T4 GPU を備えた ECS インスタンスタイプ (P100、V100、または A10 も使用できます。T4 は安価で利用でき、このチュートリアルでの使用に対応しています)
それでは、始めましょう。
ECS コンソールの概要で、[インスタンスの作成] をクリックして新しいインスタンスを作成します。 今回は、Ubuntu 22.04 LTS をオペレーティングシステムとして使用する、GPU を備えたインスタンスを作成します。
一般的なステップは以下の通りです。
• 課金方法は [従量課金] を選択します
• 利用するリージョンを選択します。 この例では、シンガポールを使用します。
• ネットワークとゾーンは、デフォルトの VPC、使用可能な任意のゾーン、およびそのゾーンのデフォルトの vSwitch を選択します。
• インスタンスとイメージで、[すべてのインスタンスタイプ] をクリックします。
• アーキテクチャは、[GPU/FPGA/ASIC] をクリックして、目的のアクセラレータを持つインスタンスのみを表示するようにインスタンスをフィルタリングします。
• 上図のスクリーンショットのようなリストが表示されます。 T4 が 1 つ (16 GB の GPU RAM を搭載) のインスタンスか、または選択したゾーンで使用可能な安価なインスタンスを選択します。 今回のデモを動作させるためには、少なくとも 16GB の GPU RAM を搭載した GPU を使用してください。
• CPU コア数は 8 以上、システム RAM は 16 GB 以上にします。
• イメージは、[パブリックイメージ]、[Ubuntu] を選択します。 バージョンリストで [Ubuntu 22.04 64-bit] を選択し、[無料セキュリティ強化] を選択します。
• ストレージには、1 TB 以上のシステムディスクが必要になる場合があります。要するに、LLM は巨大だということです。 サイズを適切に設定します。 よくわからない場合は、「1024 GiB」(1 TB) と入力してください。
• 帯域幅とセキュリティグループでは、必ず [インターネット IPv4 アドレスの割り当て] を選択してください。
• [トラフィック課金] を選択し、最大帯域幅として [100 Mbps] を選択します。 いくつかの大きなファイル (LLM は巨大です) をダウンロードするので、100 Mbps の帯域幅を使用します。
• 後でインスタンスに SSH で接続するために、キーペアを設定しておく必要があります。 ログインユーザー名は [ecs-user] を選択します (root としてログインしないようにします)。
• 使用可能なキーペアがない場合は、[キーペアの作成] をクリックし、キーペアの作成後にリストを更新します。
• 最後に、右側に表示される ECS 利用規約に同意し、[注文確認] をクリックします。
インスタンスを起動して実行中になったら、必要なソフトウェアをセットアップできるように接続します。
ここでは、ECS のデフォルト機能である Workbench リモート接続を使用して、用意したキーペアを使用してインスタンスに簡単に SSH 接続できるようにします。 次に、OS を更新し、Python がインストールされていることを確認してから、Nvidia ドライバーと CUDA をインストールします。
• 作成したインスタンスに接続するには、インスタンスのリスト (ECS コンソール -> インスタンス & イメージ -> インスタンス) に移動します。
• 起動済みのインスタンスがリストに表示されます。 [操作] 列の [接続] オプションをクリックし、[今すぐサインイン] を選択します。
• 接続には [Public IP] 、[SSH Key Authentication] を選択し、ユーザー名は [ecs-user] を使用します。
• 秘密鍵については、ボックスをクリックして保存した秘密鍵を選択します。 (キーペアの作成時に保存したものです)
おめでとうございます! ブラウザーの SSH ウィンドウが開き、ソフトウェアを設定できるようになります。
まず、次のコマンドで OS を更新します。
• sudo apt update
• sudo apt upgrade
python がインストールされていることを確認します。 以下のコマンドで python のバージョンを確認します。
• python3 --version
Python 3.10.12 または類似のものが表示されます
最も難しいのは次のステップです。Nvidia ドライバーと CUDA をインストールします。
1. まず、linux ヘッダーが必要なので、ドライバーを構築します。
sudo apt-get install linux-headers-$(uname -r)
2. その後、https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&Distribution=Ubuntu&target_version=22.04&target_type=deb_local の手順に従います。
Base Installer コマンド (1つずつ) で開始し、次に Driver Installer コマンド (legacy kernel module flavor を使用) を実行します。
ECS インスタンスの起動設定時に最大帯域幅オプションを選択しなかった場合、かなり長い時間がかかります (数 GB の NV がダウンロードされます)
3. ドライバのインストール後、以下を実行します。
echo export PATH=/usr/local/cuda-12.5/bin${PATH:+:${PATH}} >> .bashrc
4. インスタンスを再起動し (コマンド:sudo Reboot)、再度接続します。
5. CUDA が存在することを確認します。
nvcc –version
以下のような内容が表示されます。
6. NV ドライバーが存在することを確認します。
nvidia-smi
以下のような内容が表示されます。
おめでとうございます! Nvidia ドライバーと CUDA が正常にインストールされました。これで、インスタンスのすべてのパワーを生成 AI に使用できるようになりました。
このチュートリアルでは、非常に人気のあるコミュニティプロジェクト llama.cpp を使用しましょう。
1. llama.cpp のインストール
インストールコマンド:
git clone https://github.com/ggerganov/llama.cpp.git
cd llama.cpp
make -j 8 GGML_CUDA=1
(make -j 8 は、コンパイルに 8 スレッドを使用することを意味します。 インスタンスの vCore 数が 8 超えている場合は、この数を引き上げてインスタンスの vCore と同じ値を使用します。)
(このプロセスにはしばらく時間がかかります)
2. LLMをダウンロードしてインストールをテストします。
cd models
wget https://huggingface.co/Qwen/Qwen1.5-7B-Chat-GGUF/resolve/main/qwen1_5-7b-chat-q4_k_m.gguf
3. ダウンロードしたモデルを使用して推論をテストします。
cd ..
./main -m models/qwen1_5-7b-chat-q4_k_m.gguf -p "Question: Please explain Alibaba Cloud to me. I am a non-technical business executive. Answer:" -ngl 999 -c 1000 -n 2000
以下のような内容が表示されます。
ここでは、小型 LLM の量子化済み (すなわち、圧縮) バージョン Qwen1.5 7B − chat を GGUF 形式でダウンロードしました。
すでに特定の GGUF モデルを使用している場合は、それらをダウンロードして使用します。
もちろん、生成 AI をデプロイすることの真の目標は、API アクセスを提供する LLM サーバーを用意して、独自のアプリケーションで生成 AI 機能を使用できるようにすることです。
ステップ 3 では、llama.cpp をインストールし、1 つ以上のモデルをダウンロードしてから、ローカル推論を行いました。
次に、サーバーモードで llama.cpp を使用します。
./llama-server -m [model_path/model_name.gguf] -ngl 999 --host 0.0.0.0 --port 8080 --api-key [your-desired-api-key]
注:--port 8080 で、サーバーによって使用される VM のポート 8080 を指定しています。 アプリケーションが llama.cpp サーバーにアクセスできるようにするには、VM のセキュリティグループに 8080 アクセスを追加するか、または既にホワイトリストに登録されている別のポート番号をセキュリティグループに指定する必要があります。
その他のオプション
'-cb':連続バッチ処理の有効化 (推奨)
'-fa':フラッシュアテンションの有効化 (たとえば、Qwen2 で必要)
'-np N':N 個のスロットを並列に有効化して、最大コンテキストサイズを N 分割します (低コンテキストサイズモデルには推奨されません)。複数のリクエストに対するユーザーエクスペリエンスが向上します。
注意事項
llama.cpp サーバーに対して、正しいチャットテンプレートを適用してください。そうでない場合、LLM は未知のチャットデリミタを「認識」し、それがコンテンツの一部であると考え、その結果、自分自身で会話するようになり、GPU サイクルが無駄に使用されます。 例:
• llama2 の場合、サーバーの呼び出しに --chat-template llama2
を追加する必要があります。
• llama 3 の場合は llama3
、openai 互換の場合は chatml
です
• https://github.com/ggerganov/llama.cpp/wiki/Templates-supported-by-llama_chat_apply_template を参照
以下に、Llama 3 8B 命令を使用した適切なサーバー呼び出しの例を示します。
llama.cpp/llama-server -m LLMs/gguf/Meta-Llama-3-8B-Instruct-v2.Q5_K_M.gguf -ngl 999 -cb -np 3 --host 0.0.0.0 --port 8080 --api-key myapikey --chat-template llama3
上図の例では、正しいチャットテンプレートを指定し、-ngl 999 を使用して、パフォーマンスを最大化するためにすべてのレイヤーを GPU にオフロードするようサーバーに指示しています。
次に、Qwen 2 を使用した例を示します。
llama.cpp/llama-server -m LLMs/gguf/qwen2-7b-instruct-q5_k_m.gguf -ngl 999 -fa -cb -np 3 --host 0.0.0.0 --port 8080 --api-key myapikey
llama.cpp で qwen2 を使用した上記の例では、-fa フラグ (qwen2 に必要) を使用してフラッシュアテンションを使用しました。 チャットテンプレートを指定する必要はありません。これは、llama.cpp でサポートされているデフォルトのテンプレートが使用されるためです。
llama.cpp サーバーを起動して実行中になったら (モデルを最初に読み込む際は、起動に時間がかかることがあるので、辛抱強く待ちましょう)、最後に行うことはコードを使用して API サーバーにアクセスすることです。
OpenAI クライアント Python ライブラリが必要なので、pip を使用してインストールします。
pip install openai
以下に、インスタンスに接続するためのサンプル python コードを示します。
llama.cpp サーバーの良いところは、OpenAI 互換の API サーバーが提供されることです。 つまり、既に OpenAI API スタイルを使用するコードが多くある場合、llama.cpp を搭載した Alibaba Cloud インスタンスは簡単に使用できます。 正しいホスト、ポート、API キーを設定する以外は、既存のコードをほとんど変更することなく使用できます。
上図では、コードを実行した際のサンプル出力が表示されています。 システムプロンプトに従って、休暇や船旅で何ができるかを海賊のような口調で提案しています。
パート 1 はいかがでしたか。 ECS インスタンスを作成し、Nvidia ドライバーと CUDA をインストールして、インスタンスで GPU を利用できるようにし、独自の llama.cpp サーバーをインストールして設定しました。
最終的に、OpenAI 互換の API サーバーを提供する専用のプライベートインスタンスを作成し、生成 AI 機能をアプリケーションに簡単に統合できました。
続くパート 2 では、作業ステップと管理の手間が少ない、簡単かつ速い方法で生成 AI をデプロイします。
本記事の作成者について:JV は Alibaba Cloud フィリピンのシニアソリューションアーキテクトであり、チームのデータおよび生成 AI 戦略を主導しています。 この記事の内容が、お客様のビジネス上の問題のいくつかに関連していると思われる場合、JV (jv.roig@alibaba-inc.com) までお問い合わせください。
この記事は英語から翻訳されました。 元の記事は こちら です。
89 posts | 3 followers
FollowRegional Content Hub - August 28, 2024
Regional Content Hub - August 28, 2024
Regional Content Hub - February 26, 2024
Regional Content Hub - March 8, 2024
Regional Content Hub - January 19, 2024
Regional Content Hub - March 8, 2024
89 posts | 3 followers
FollowPowerful parallel computing capabilities based on GPU technology.
Learn MoreElastic and secure virtual cloud servers to cater all your cloud hosting needs.
Learn MoreAccelerate AI-driven business and AI model training and inference with Alibaba Cloud GPU technology
Learn MoreTop-performance foundation models from Alibaba Cloud
Learn MoreMore Posts by Regional Content Hub