- Oracle Cloud
- Oracle Database
OCIでGPUインスタンスを構築してみた
OCIで提供されている生成AIサービスとGPUインスタンスを前回の記事「生成AIにGPUが適している理由」で紹介しました。本記事では、GPUインスタンスをデプロイして、インスタンス上でLLM(大規模言語モデル)の動作環境を構築する方法をご紹介します。
|
Index
BaseDB に対して接続するクライアント環境(本記事ではオンプレミスの Oracle Linux 8.5 x86-64 のサーバ)に OCI CLI を導入します。
手順については以下の記事の「OCI CLIインストール」および「OCI CLIコマンド利用設定」の項目をご参照ください。
OCI CLIを利用してコマンドラインからOCIを操作する方法
https://www.ashisuto.co.jp/db_blog/article/N0021_OracleCloud_20200626.html
※OCI CLIを既にインストールおよび利用設定済みの場合、こちらの手順は不要です。
まず最初に、OCI CLI を利用して BaseDB に接続をするユーザーに対してBaseDB の一覧の表示や起動・停止、作業リクエストの表示を行う権限を付与するため、対象のユーザーが所属するグループに対してポリシーを作成します。既に管理者グループに所属している場合はこの手順は不要です。
OCI コンソールのメニューから、「アイデンティティとセキュリティ > ポリシー」 より「ポリシーの作成」をクリックします。
|
|
「ポリシーの作成」画面で各項目を入力、選択します。
「ポリシー・ビルダー」の項目で「手動エディタの表示」のトグル・スイッチを有効にして以下の内容を入力し、「作成」をクリックします。
Allow group <Group_Name> to read database-family in compartment <Compartment_Name>
Allow group <Group_Name> to {DB_NODE_POWER_ACTIONS} in compartment <Compartment_Name>
Allow group <Group_Name> to inspect work-requests in compartment <Compartment_Name>
|
次に、OCI CLI でコマンドを実行する前に、OCI コンソールを利用して対象ノードの OCID を確認します。
OCI コンソールのメニューから、「Oracle Database > Oracle Base Database (VM、BM)」 よりサービス・インスタンスの一覧を表示します。
|
|
接続先のインスタンスを選択し、”リソース”より「ノード」を選択します。右端にあるメニューより、「OCIDのコピー」を選択します。
|
以上の準備ができたら、OCI CLI を導入したサーバで以下のコマンドを実行します。
oci db node get --db-node-id <事前に確認したノードの OCID>
$ oci db node get --db-node-id ocid1.dbnode.oc1.ap-tokyo-1.XXXXXXXXXXXXXXXXXXXXXXxv4q4arrcw7sgka7xq
{
"data": {
"additional-details": null,
"backup-ip-id": null,
"backup-vnic-id": null,
"backup-vnic2-id": null,
"cpu-core-count": 1,
"db-node-storage-size-in-gbs": null,
"db-server-id": null,
"db-system-id": "ocid1.dbsystem.oc1.ap-tokyo-1.XXXXXXXXXXXXXXXXXXXXXXvpo6kkbro6u3ti4x5a",
"fault-domain": "FAULT-DOMAIN-2",
"host-ip-id": null,
"hostname": "kkadbs",
"id": "ocid1.dbnode.oc1.ap-tokyo-1.XXXXXXXXXXXXXXXXXXXXXXxv4q4arrcw7sgka7xq",
"lifecycle-state": "STOPPED", ---インスタンス状態(停止済)
"maintenance-type": null,
"memory-size-in-gbs": null,
"software-storage-size-in-gb": 200,
"time-created": "2023-04-17T02:30:55.801000+00:00",
"time-maintenance-window-end": null,
"time-maintenance-window-start": null,
"vnic-id": "ocid1.vnic.oc1.ap-tokyo-1.XXXXXXXXXXXXXXXXXXXXXXvp5uzfeopqyupf37eq",
"vnic2-id": null
},
"etag": "8598f531--gzip"
}
サービス・インスタンスが停止している場合に、起動操作を実行します。
※プロンプトはすぐに戻ってきますが、起動処理は実行中です。
(プロンプトが戻ってくる=起動済ではありません。)
処理が完了したかどうかは、状態確認のコマンドを利用して ”
lifecycle-state
” を確認します。
oci db node start --db-node-id <事前に確認したノードの OCID>
$ oci db node start db-node-id ocid1.dbnode.oc1.ap-tokyo-1.XXXXXXXXXXXXXXXXXXXXXXxv4q4arrcw7sgka7xq
{
"data": {
"additional-details": null,
"backup-ip-id": null,
"backup-vnic-id": null,
"backup-vnic2-id": null,
"cpu-core-count": 1,
"db-node-storage-size-in-gbs": null,
"db-server-id": null,
"db-system-id": "ocid1.dbsystem.oc1.ap-tokyo-1.XXXXXXXXXXXXXXXXXXXXXXvpo6kkbro6u3ti4x5a",
"fault-domain": "FAULT-DOMAIN-2",
"host-ip-id": null,
"hostname": "kkadbs",
"id": "ocid1.dbnode.oc1.ap-tokyo-1.XXXXXXXXXXXXXXXXXXXXXXxv4q4arrcw7sgka7xq",
"lifecycle-state": "STARTING", ---インスタンスの状態(起動中)
"maintenance-type": null,
"memory-size-in-gbs": null,
"software-storage-size-in-gb": 200,
"time-created": "2023-04-17T02:30:55.801000+00:00",
"time-maintenance-window-end": null,
"time-maintenance-window-start": null,
"vnic-id": "ocid1.vnic.oc1.ap-tokyo-1.XXXXXXXXXXXXXXXXXXXXXXvp5uzfeopqyupf37eq",
"vnic2-id": null
},
"etag": "2d691fe5",
"opc-work-request-id": "ocid1.coreservicesworkrequest.oc1.ap-tokyo-1.XXXXXXXXXXXXXXXXXXXXXX4o6vlazvkt5bawkzpq"
}
OCI コンソールの状態は処理直後は”起動中”と表示されます。
|
処理が完了すると OCI コンソールの状態は”使用可能”と表示されます。
|
サービス・インスタンスが起動している場合に、停止操作を実行します。
※プロンプトはすぐに戻ってきますが、停止処理は実行中です。
(プロンプトが戻ってくる=停止済ではありません。)
処理が完了したかどうかは、状態確認のコマンドを利用して ”
lifecycle-state
” を確認します。
oci db node stop --db-node-id <事前に確認したノードの OCID>
$ oci db node stop --db-node-id ocid1.dbnode.oc1.ap-tokyo-1.XXXXXXXXXXXXXXXXXXXXXXxv4q4arrcw7sgka7xq
{
"data": {
"additional-details": null,
"backup-ip-id": null,
"backup-vnic-id": null,
"backup-vnic2-id": null,
"cpu-core-count": 1,
"db-node-storage-size-in-gbs": null,
"db-server-id": null,
"db-system-id": "ocid1.dbsystem.oc1.ap-tokyo-1.XXXXXXXXXXXXXXXXXXXXXXvpo6kkbro6u3ti4x5a",
"fault-domain": "FAULT-DOMAIN-2",
"host-ip-id": null,
"hostname": "kkadbs",
"id": "ocid1.dbnode.oc1.ap-tokyo-1.XXXXXXXXXXXXXXXXXXXXXXxv4q4arrcw7sgka7xq",
"lifecycle-state": "STOPPING", ---インスタンス状態(停止中)
"maintenance-type": null,
"memory-size-in-gbs": null,
"software-storage-size-in-gb": 200,
"time-created": "2023-04-17T02:30:55.801000+00:00",
"time-maintenance-window-end": null,
"time-maintenance-window-start": null,
"vnic-id": "ocid1.vnic.oc1.ap-tokyo-1.XXXXXXXXXXXXXXXXXXXXXXvp5uzfeopqyupf37eq",
"vnic2-id": null
},
"etag": "9e604161",
"opc-work-request-id": "ocid1.coreservicesworkrequest.oc1.ap-tokyo-1.XXXXXXXXXXXXXXXXXXXXXXswkfpmlzhuodu2x3oq"
}
OCI コンソールの状態は処理直後は”停止中”と表示されます。
|
処理が完了すると OCI コンソールの状態は”停止済”と表示されます。
|
いよいよここから、本記事の主題であるBaseDBの起動・停止の自動化に入っていきます。
まず、OCI CLI を導入したサーバで、OCI CLI を使用した Base DB の起動・停止コマンドを実行するスクリプトを作成します。
その後、cron やタスクスケジューラなど OS 側の機能を使用してシェルスクリプトの実行を自動化します。
本記事では、OCI CLI を導入したオンプレミスの Oracle Linux 8.5 x86-64 のサーバで、BaseDB の起動・停止コマンドを実行するシェルスクリプトを作成します。
以下のサンプルはシンプルな作りのため、条件分岐などは要件に応じて作り込む必要があります。ファイル名と配置場所は任意です。
/home/kka/work/oci_start.sh
#!/bin/bash
date >> /home/kka/work/logs/oci_start.log
/home/kka/bin/oci db node start --db-node-id ocid1.dbnode.oc1.ap-tokyo-1.XXXXXXXXXXXXXXXXXXXXXXxv4q4arrcw7sgka7xq | grep -ie lifecycle-state >> /home/kka/work/logs/oci_start.log
sleep 300
echo sleep 300s >> /home/kka/work/logs/oci_start.log
date >> /home/kka/work/logs/oci_start.log
/home/kka/bin/oci db node get --db-node-id ocid1.dbnode.oc1.ap-tokyo-1.XXXXXXXXXXXXXXXXXXXXXXxv4q4arrcw7sgka7xq | grep -ie lifecycle-state >> /home/kka/work/logs/oci_start.log
以下のサンプルはシンプルな作りのため、条件分岐などは要件に応じて作り込む必要があります。ファイル名と配置場所は任意です。
/home/kka/work/oci_stop.sh
#!/bin/bash
date >> /home/kka/work/logs/oci_stop.log
/home/kka/bin/oci db node stop --db-node-id ocid1.dbnode.oc1.ap-tokyo-1.XXXXXXXXXXXXXXXXXXXXXXxv4q4arrcw7sgka7xq | grep -ie lifecycle-state >> /home/kka/work/logs/oci_stop.log
sleep 300
echo sleep 300s >> /home/kka/work/logs/oci_stop.log
date >> /home/kka/work/logs/oci_stop.log
/home/kka/bin/oci db node get --db-node-id ocid1.dbnode.oc1.ap-tokyo-1.XXXXXXXXXXXXXXXXXXXXXXxv4q4arrcw7sgka7xq | grep -ie lifecycle-state >> /home/kka/work/logs/oci_stop.log
各シェルスクリプトの作成後、実行権限を付与します。
$ chmod +x /home/kka/work/oci_start.sh $ chmod +x /home/kka/work/oci_stop.sh
実行権限を付与した後、各シェルスクリプトを手動実行することで BaseDB の起動・停止が正常に行われるか確認します。
$ /home/kka/work/oci_start.sh $ /home/kka/work/oci_stop.sh
本記事では cron を利用してシェルスクリプトの実行を自動化します。
cron を使用するには crond のサービスが起動している必要があるため、crond のサービスの状態を確認します。
本記事では systemd を使用してサービス管理を行う環境のため、systemctl コマンドを使用しています。
確認の結果、”
Active: active (running)
” と表示されている場合は crond のサービスが起動しています。
$ systemctl status crond
● crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor prese>
Active: active (running) since Tue 2023-04-18 02:04:00 UTC; 24h ago
Main PID: 140805 (crond)
Tasks: 1 (limit: 48719)
Memory: 1.2M
CGroup: /system.slice/crond.service
mq140805 /usr/sbin/crond -n
:
crond のサービスが起動していない場合は root ユーザーで起動します。
# systemctl start crond
crontab -e コマンドを実行することでエディタが起動するので、cron の設定を行います。
設定後、crontab -l コマンドを実行することで cron の設定を確認できます。
時刻は
OS のタイムゾーンに準拠する
点にご注意ください。
本記事のクライアント環境では OS のタイムゾーンが UTC のため、以下の例では、 毎日 1:00 UTC(10:00 JST) に /home/kka/work/oci_start.sh を実行、毎日10:00 UTC(19:00 JST) に /home/kka/work/oci_stop.sh を実行します。
分 時 日 月 曜日 コマンド
※曜日の指定は 0(日曜) - 6(土曜) で指定します
OCI コンソールから、接続先のインスタンスのページを表示し、”リソース”より「作業リクエスト」を選択します。
”Start Node” と ”Stop Node” の開始日時や終了日時から、cron で指定した時刻に起動・停止が実行されているか確認します。
|
BaseDB のノードを停止した場合、DB は shutdown abort で停止されるという仕様の動作になっています。
shutdown abort で停止される明確な理由については公開されていませんが、OCI では課金が発生してしまう都合上、OCI の設計思想として速やかに停止するために abort で停止されると考えられます。
DB は shutdown abort で停止されますが、次回起動時に自動的にクラッシュリカバリが実行されるため、ユーザー側での対応は不要です。
BaseDB の自動バックアップ取得は、ノードが起動した状態、および DB インスタンスがオープンした状態でなければ実行されません。
そのため、BaseDB の自動バックアップのスケジュールを考慮してノードの自動停止時刻を決定する必要があります。
技術的には OS コマンド (reboot コマンド)による再起動は可能ですが、オラクル社が公開している以下資料に記載があるとおり、OS にログインして直接操作可能な処理であっても実行することは非推奨であり、OCI 上で実装されているツールの利用が推奨されています。
https://speakerdeck.com/oracle4engineer/bm-ji-shu-xiang-xi?slide=52
Base Database Service
非推奨・お勧めしない操作、注意点
6 OCIコンソール、ocicliで実施可能な処理をその他の処理方法で直接実施しないでください。
BaseDB の起動・停止に限った内容ではありませんが、OCI CLI を実行する際にプロキシサーバを経由する場合、事前に環境変数 https_proxy の指定が必要です。
export https_proxy=http://<プロキシサーバの IP アドレスまたはホスト名>:<ポート番号>
または
export https_proxy=http://<プロキシ認証のユーザー名>:<パスワード>@<プロキシサーバの IP アドレスまたはホスト名>:<ポート番号>
$ export https_proxy=http://kka-proxy:8090/
set https_proxy=http://<プロキシサーバの IP アドレスまたはホスト名>:<ポート番号>
または
set https_proxy=http://<プロキシ認証のユーザー名>:<パスワード>@<プロキシサーバの IP アドレスまたはホスト名>:<ポート番号>
DOS> set https_proxy=http://kka-proxy:8090/
本記事では BaseDB の起動・停止を自動化する方法をご紹介しました。
停止忘れによる意図しない課金を抑えるため、また、管理者の方の管理負荷を下げるために、本記事がお役に立てば幸いです。
2008年度アシストに入社後、Oracle WebLogic Server や Oracle HTTP Server を中心にサポートエンジニアとして活動しており、これまでに4000件以上の問い合わせを対応。
■本記事の内容について
本記事に示した定義及び条件は変更される場合があります。あらかじめご了承ください。
■商標に関して
・Oracle®、Java、MySQL及びNetSuiteは、Oracle、その子会社及び関連会社の米国及びその他の国における登録商標です。
・Amazon Web Services、AWS、Powered by AWS ロゴ、[およびかかる資料で使用されるその他の AWS 商標] は、Amazon.com, Inc. またはその関連会社の商標です。
文中の社名、商品名等は各社の商標または登録商標である場合があります。
OCIで提供されている生成AIサービスとGPUインスタンスを前回の記事「生成AIにGPUが適している理由」で紹介しました。本記事では、GPUインスタンスをデプロイして、インスタンス上でLLM(大規模言語モデル)の動作環境を構築する方法をご紹介します。
前回の記事でお伝えしたとおり、OCVSを構築するとVMwareの複数の機能が利用可能です。 それらの機能の中で、今回はHCXの概要や具体的な機能、OCVSでHCXを利用するメリットなどをお伝えします!
2024年5月にOracle Cloud環境にて、先行してOracle DB 23aiがリリースされました。 Oracle Base Database ServiceにおけるOracle Database 23aiの検証結果を報告します。 今回は「統合メモリー管理」をテーマにお伝えします。