このトピックでは、Fashion-MNISTという名前のオープンソースデータセットを例として使用し、クラウドネイティブAIコンポーネントセットを使用して、Container Service for Kubernetes (ACK) クラスターでディープラーニングジョブを実行し、分散トレーニングのパフォーマンスを最適化し、モデルを調整し、モデルをACKクラスターにデプロイするタスクを完了する方法を説明します。
背景情報
クラウドネイティブAIコンポーネントセットには、Helmチャートを使用して個別にデプロイできるコンポーネントが含まれています。 これらのコンポーネントを使用して、AIプロジェクトを高速化できます。
クラウドネイティブAIコンポーネントセットは、管理者と開発者の2種類のロールに適しています。
管理者は、ダッシュボードを使用して、ユーザーと権限の管理、クラスターリソースの割り当て、外部ストレージの構成、データセットの管理、リソース使用率の監視を行います。
開発者はクラスターリソースを使用してジョブを送信します。 開発者は管理者によって作成され、ArenaやJupyter Notebookなどのツールを使用して開発を実行する前に権限を付与する必要があります。
前提条件
次の操作は管理者によって完了します。
ACKクラスターが作成されます。 詳細については、「ACK管理クラスターの作成」をご参照ください。
クラスター内の各ノードのディスクサイズは少なくとも300 GBです。
最適なデータアクセラレーションが必要な場合は、それぞれ8つのV100 GPUを提供する4つのECS (Elastic Compute Service) インスタンスを使用します。
最適なトポロジ認識が必要な場合は、それぞれ2つのV100 GPUを提供する2つのECSインスタンスを使用します。
クラウドネイティブAIコンポーネントセットに含まれるすべてのコンポーネントがクラスターにインストールされます。 詳細については、「クラウドネイティブAIスイートのデプロイ」をご参照ください。
AIダッシュボードはすぐに使用できます。 詳細については、「AIダッシュボードへのアクセス」をご参照ください。
AI開発者コンソールは使用可能です。 詳細については、「AI開発者コンソールへのログイン」をご参照ください。
Fashion-MNISTデータセットがダウンロードされ、Object Storage Service (OSS) バケットにアップロードされます。 モデルをOSSバケットにアップロードする方法の詳細については、「オブジェクトのアップロード」をご参照ください。
テストコードを格納するGitリポジトリのアドレス、ユーザー名、およびパスワードが取得されます。
kubectlクライアントがクラスターに接続されています。 詳細については、「クラスターのkubeconfigファイルを取得し、kubectlを使用してクラスターに接続する」をご参照ください。
アリーナがインストールされています。 詳細については、「Arenaクライアントの設定」をご参照ください。
テスト環境
この例では、クラウドネイティブのAIコンポーネントセットとオープンソースのFashion-MNISTデータセットを使用して、AIモデルを開発、トレーニング、高速化、管理、評価、およびデプロイします。
管理者は次のタスクを完了する必要があります。ステップ1: ユーザーの作成とリソースの割り当ておよびステップ2: データセットの作成。 残りのタスクは開発者が完了できます。
開発者はJupyter Notebookで端末を作成するか、ACKクラスターのジャンプサーバーを使用してArenaコマンドを送信する必要があります。 Arenaコマンドの送信にはJupyter Notebookをお勧めします。
次の表に、クラスター内のノードを示します。
ホスト名 | IP | ロール | GPUの数 | vCPUの数 | メモリ |
cn-beijing.192.168.0.13 | 192.168.0.13 | ジャンプサーバー | 1 | 8 | 30580004 KiB |
cn-beijing.192.168.0.16 | 192.168.0.16 | ワーカー | 1 | 8 | 30580004 KiB |
cn-beijing.192.168.0.17 | 192.168.0.17 | ワーカー | 1 | 8 | 30580004 KiB |
cn-beijing.192.168.0.240 | 192.168.0.240 | ワーカー | 1 | 8 | 30580004 KiB |
cn-beijing.192.168.0.239 | 192.168.0.239 | ワーカー | 1 | 8 | 30580004 KiB |
実験の目的
このトピックは、次の目的を達成することを目的としています。
データセットを管理します。
Jupyter Notebookを使用して開発環境を構築します。
スタンドアロンのトレーニングジョブを送信します。
分散トレーニングジョブを送信します。
Fluidを使用してトレーニング作業を加速します。
ACKのAIジョブスケジューラを使用して、トレーニングジョブを高速化します。
モデルを管理します。
モデルを評価します。
推論サービスを展開します。
ステップ1: ユーザーを作成してリソースを割り当てる
開発者は、管理者から次の情報とリソースを取得する必要があります。
ユーザーのユーザー名とパスワード。 ユーザーの作成方法の詳細については、「ユーザーの管理」をご参照ください。
リソースの割り当て リソースクォータを割り当てる方法の詳細については、「エラスティッククォータグループの管理」をご参照ください。
開発者がAI開発者コンソールを使用してジョブを送信する場合のAI開発者コンソールのエンドポイント。 AI開発者コンソールへのアクセス方法の詳細については、「AI開発者コンソールへのログイン」をご参照ください。
開発者がArenaを使用してジョブを送信する場合に、クラスターにログインするために使用されるkubeconfigファイル。 クラスターへのログインに使用されるkubeconfigファイルの取得方法の詳細については、「手順2: クラスター資格情報の種類の選択」をご参照ください。
ステップ2: データセットの作成
管理者はデータセットを準備する必要があります。 この例では、Fashion-MNISTデータセットが使用されています。
a: Fashion-MNISTデータセットの追加
次のYAMLテンプレートを使用して、fashion-mnist.yamlという名前のファイルを作成します。
この例では、Fashion-MNISTデータセットを格納するOSSバケットをマウントするために、永続ボリューム (PV) と永続ボリューム要求 (PVC) が作成されます。
apiVersion: v1 kind: PersistentVolume メタデータ: 名前: fashion-demo-pv spec: accessModes: - ReadWriteMany capacity: storage: 10Gi csi: driver: ossplugin.csi.alibabacloud.com volumeAttributes: bucket: fashion-mnist otherOpts: "" url: oss-cn-beijing.aliyuncs.com akId: "AKID" akSecret: "AKSECRET" volumeHandle: fashion-demo-pv persistentVolumeReclaimPolicy: Retain storageClassName: oss volumeMode: ファイルシステム --- apiVersion: v1 kind: PersistentVolumeClaim メタデータ: 名前: fashion-demo-pvc 名前空間: demo-ns spec: accessModes: - ReadWriteMany resources: requests: storage: 10Gi セレクタ: matchLabels: alicloud-pvname: ファッションデモ-pv storageClassName: oss volumeMode: ファイルシステム volumeName: ファッション-デモ-pv
次のコマンドを実行して、fashion-mnist.yamlファイルを作成します。
kubectl create -f fashion-mnist.yaml
作成したPVとPVCのステータスを確認します。
次のコマンドを実行して、作成されたPVのステータスを確認します。
kubectl get pv fashion-mnist-jackwg
期待される出力:
が容量アクセスモードに名前を付けると、ポリシーステータスはSTORAGECLASSの理由年齢を主張します fashion-mnist-jackwg 10Gi RWX Retainバウンドns1/fashion-mnist-jackwg-pvc oss 8h
次のコマンドを実行して、作成されたPVCのステータスを確認します。
kubectl get pvc fashion-mnist-jackwg-pvc -n ns1
期待される出力:
名ステータスボリューム容量アクセスモードSTORAGECLASS年齢 ファッション-mnist-jackwg-pvcバウンドファッション-mnist-jackwg 10Gi RWX oss 8h
出力は、PVとPVCの両方がBound状態にあることを示しています。
b: データセットの高速化
管理者はAIダッシュボードを使用してデータセットを高速化する必要があります。
- 管理者としてAccess AI Dashboardをします。
- AIダッシュボードの左側のナビゲーションウィンドウで、 を選択します。
[データセットリスト] ページでデータセットを見つけ、[演算子] 列の [高速化] をクリックします。
次の図は、高速化されたデータセットを示しています。
ステップ3: モデルを開発する
このセクションでは、Jupyter Notebookを使用して開発環境を構築する方法について説明します。 手順:
オプションです。 カスタムイメージを使用してJupyterノートブックを作成します。
Jupyterノートブックを使用して、モデルを開発およびテストします。
Gitリポジトリにコードを送信するには、Jupyterノートブックを使用します。
Arena SDKを使用して、トレーニングジョブを送信します。
a (オプション): カスタムイメージを使用してJupyterノートブックを作成
AI開発者コンソールには、Jupyterノートブックを作成するためのTensorFlowとPyTorchをサポートするさまざまなバージョンの画像が用意されています。 カスタムイメージを使用してJupyterノートブックを作成することもできます。
次のDockerfileテンプレートを使用して、Dockerfileという名前のファイルを作成します。
カスタムイメージの制限の詳細については、「ノートブックの作成と使用」をご参照ください。
cat<<EOF >dockerfile tensorflow/tensorflowから: 1.15.5-gpu ユーザールート RUN pipインストールjupyter && \ pipインストールipywidgets && \ jupyter nbextension enable -- py widgetsnbextension && \ pip install jupyterlab && jupyter serverextension enable -- py jupyterlab 輸出8888 # USER jovyan CMD ["sh" 、"-c" 、"jupyter-lab-notebook-dir=/home/jovyan-ip=0.0.0.0-ブラウザなし-許可-ルート-ポート=8888-NotebookApp.token=''-NotebookApp.password=''-NotebookApp.allow_origin='*' * '-NotebookApp.base_url=$ EOF
次のコマンドを実行して、Dockerfileからイメージをビルドします。
docker build -f dockerfile。
期待される出力:
Dockerデーモンへのビルドコンテキストの送信9.216kB ステップ1/5: tensorflow/tensorflowから: 1.15.5-gpu ---> 73be11373498 ステップ2/5 : USER root ---> キャッシュの使用 ---> 7ee21dc7e42e ステップ3/5: 実行pip install jupyter && pip install ipywidgets && jupyter nbextension enable -- py widgetsnbextension && pip install jupyterlab && jupyter serverextension enable -- py jupyterlab ---> キャッシュの使用 ---> 23bc51c5e16d ステップ4/5 : EXPOSE 8888 ---> キャッシュの使用 ---> 76a55822ddae ステップ5/5 : CMD ["sh", "-c", "jupyter-lab-notebook-dir=/home/jovyan-ip=0.0.0-no-browser-allow-root-port=8888-NotebookApp.token=''-NotebookApp.password=''-NotebookApp.allow_origin='*'-Notebook_met_arate_arity=${Falmet_App} '] ---> キャッシュの使用 ---> 3692f04626d5 正常に構築された3692f04626d 5
次のコマンドを実行して、イメージをDockerイメージリポジトリにプッシュします。
dockerタグ ${IMAGE_ID} registry-vpc.cn-beijing.aliyuncs.com/${DOCKER_REPO}/jupyter:fashion-mnist-20210802a docker pus h registry-vpc.cn-beijing.aliyuncs.com/${DOCKER_REPO}/jupyter: ファッションmnist-20210802a
Dockerイメージリポジトリからイメージをプルするために使用されるシークレットを作成します。
詳細については、「既存のDocker資格情報に基づくシークレットの作成」をご参照ください。
kubectl create secret docker-registry regcred \ -- docker-server=<レジストリサーバー> \ -- docker-username=<ユーザー名> \ -- docker-password=<パスワード> \ -- docker-email=<あなたのメールアドレス>
AI開発者コンソールでJupyterノートブックを作成します。
詳細については、「ノートブックの作成と使用」をご参照ください。
次の図は、Jupyterノートブックを作成するためのパラメーターを示しています。
b: Jupyterノートブックを使用してモデルを開発およびテスト
- AI開発者コンソール
へのログイン - AI開発者コンソールの左側のナビゲーションウィンドウで、[ノートブック] をクリックします。
[ノートブック] ページで、[実行中] 状態のJupyterノートブックをクリックします。
CLIランチャーを作成し、データセットがマウントされていることを確認します。
pwd /ルート /データ ls -alh
期待される出力:
合計30M drwx ----- 1ルートルート0 1月1日1970。 drwx ------ 1ルートルート4.0K 8月2 04:15 .. drwxr-xr-x 1ルートルート0 8月1 14:16 saved_model -rw-r ----- 1ルートルート4.3M Aug 1 01:53 t10k-images-idx3-ubyte.gz -rw-r ----- 1ルートルート5.1K 8月1 01:53 t10k-labels-idx1-ubyte.gz -rw-r ----- 1ルートルート26M 8月1 01:54 train-images-idx3-ubyte.gz -rw-r ----- 1ルート29K 8月1 01:53 train-labels-idx1-ubyte.gz
Fashion-MNISTデータセットに基づいてモデルをトレーニングするために使用するJupyterノートブックを作成します。 次のコードブロックは、ノートブックの初期化に使用されます。
#!/usr/bin/python # -*-コーディング: UTF-8 -*- osのインポート gzipのインポート numpyをnpとしてインポートする tensorflowをtfとしてインポートする tensorflow import kerasから 印刷 ('TensorFlowバージョン: {}'.format(tf.__version__)) dataset_path = "/root/data/" model_path = "./model/" model_version = "v1" def load_data(): files = [ 'train-labels-idx1-ubyte.gz '、 'train-images-idx3-ubyte.gz '、 't10k-labels-idx1-ubyte.gz '、 't10k-images-idx3-ubyte.gz' ] パス= [] ファイル内のfnameの場合: paths.append(os.path.join(dataset_path, fname)) gzip.open (パス [0], 'rb') をlabelpathとして使用する: y_train = np.frombuffer(labelpath.read(), np.uint8, offset=8) gzip.open (パス [1] 、'rb') をimgpathとして使用します。 x_train = np.frombuffer(imgpath.read(), np.uint8, offset=16).reshape(len(y_train), 28,28) gzip.open (パス [2] 、'rb') をlabelpathとして使用する: y_test = np.frombuffer(labelpath.read(), np.uint8, offset=8) gzip.open (パス [3], 'rb') をimgpathとして: x_test = np.frombuffer(imgpath.read(), np.uint8, offset=16).reshape(len(y_test), 28,28) return (x_train, y_train),(x_test, y_test) def train(): (train_images, train_labels), (test_images, test_labels) = load_data() # 値を0.0から1.0にスケーリングします train_images = train_images / 255.0 test_images = test_images / 255.0 # モデルに供給するための形状変更 train_images = train_images.reshape(train_images.shape[0], 28,28, 1) test_images = test_images.reshape(test_images.shape[0], 28,28, 1) class_names = ['Tシャツ /トップ' 、'ズボン' 、'プルバー' 、'ドレス' 、'コート' 、 「サンダル」、「シャツ」、「スニーカー」、「バッグ」、「アンクルブーツ」] print('\ntrain_images.shape: {}, of {}'.format(train_images.shape, train_images.dtype)) プリント ('test_images.shape: {}, of {}'.format(test_images.shape, test_images.dtype)) model = keras.Sequential([ keras.layers.Conv2D(input_shape=(28,28、1) 、filters=8、kernel_size=3、 strides=2、activation='relu' 、name='Conv1') 、 keras.layers.Flatten() 、 keras.layers.Dense (10, activation=tf.nn.softmax, name='Softmax') ]) model.summary() testing = False エポック=5 model.comパイル (optimizer='adam' 、 loss='sparse_categorical_crossentropy '、 metrics=['accuracy']) logdir = "/training_logs" tensorboard_callback = keras.ca llbacks.TensorBoard(log_dir=logdir) model.fit(train_images、 train_labels, epochs=epochs、 callbacks=[tensorboard_callback] 、 ) test_loss, test_acc = model.evaluate(test_images, test_labels) プリント ('\nテスト精度: {}'.format(test_acc)) export_path = os.path.join(model_path, model_version) print('export_path = {}\ n'.format(export_path)) tf.keras.mo dels.save_model ( モデル、 export_path, overwrite=True、 include_optimizer=True、 save_format=なし、 signatures=なし、 options=なし ) print('\nSaved model success') if __name__ ='__main__': train()
重要dataset_pathとmodel_pathをデータセットとモデルのパスに置き換えます。 これにより、ノートブックはクラスターにマウントされているデータセットにアクセスできます。
ノートブックの
アイコンをクリックします。
期待される出力:
TensorFlowバージョン: 1.15.5 train_images.shape :( 60000、28、28、1) 、float64の test_images.shape :( 10000, 28, 28, 1) 、of float64 モデル: "sequential_2" _________________________________________________________________ レイヤー (タイプ) 出力形状Param# ================================================================= Conv1 (Conv2D) (なし、13、13、8) 80 _________________________________________________________________ flatten_2 (フラット) (なし、1352) 0 _________________________________________________________________ Softmax (密) (なし、10) 13530 ================================================================= 総パラメーター: 13,610 訓練可能なパラメータ: 13,610 トレーニング不可能なパラメータ: 0 _________________________________________________________________ 60000サンプルのトレーニング エポック1/5 60000/60000 [==============================] - 3s 57us/sample - loss: 0.5452 - acc: 0.8102 エポック2/5 60000/60000 [==============================] - 3s 52us/sample - loss: 0.4103 - acc: 0.8555 エポック3/5 60000/60000 [==============================] - 3s 55us/sample - loss: 0.3750 - acc: 0.8681 エポック4/5 60000/60000 [==============================] - 3s 55us/sample - loss: 0.3524 - acc: 0.8757 エポック5/5 60000/60000 [==============================] - 3s 53us/sample - loss: 0.3368 - acc: 0.8798 10000/10000 [==============================] - 0s 37us/sample - loss: 0.3770 - acc: 0.8673 テスト精度: 0.8672999739646912 export_path= /モデル /v1 保存されたモデルの成功
c: Jupyterノートブックを使用してGitリポジトリにコードを送信
ノートブックを作成したら、そのノートブックを使用してGitリポジトリにコードを送信できます。
次のコマンドを実行してGitをインストールします。
apt-getアップデート apt-getインストールgit
次のコマンドを実行してGitを初期化し、ユーザー名とパスワードをノートブックに保存します。
git config -- global credential.helper store git pull ${YOUR_GIT_REPO}
次のコマンドを実行して、Gitリポジトリにコードをプッシュします。
gitプッシュ起源ファッションテスト
期待される出力:
合計0 (デルタ0) 、再利用0 (デルタ0) T o codeup.aliyun.com:60 b4cf5c66bba1c04b442e49/tensorflow-fashion-mnist-sample.git * [new branch] fashion-test -> fashion-test
d: Arena SDKを使用してトレーニングジョブを送信
Arena SDKの依存関係をインストールします。
! pipインストールcoloredlogs
次のコードを使用して、初期化用のPythonファイルを作成します。
osのインポート インポートsys インポート時間 arenasdk.client.client importからArenaClient arenasdk.enums.types import * から arenasdk.exceptions.arena_exception import * から arenasdk.training.tensorflow_job_builder import * から arenasdk.logger.loggerからLoggerBuilderをインポート def main(): 印刷 (「アリーナのテスト開始-python-sdk」) client = ArenaClient("","demo-ns","info","arena-system") # トレーニングジョブはdemo-ns名前空間に送信されます。 print("create ArenaClient success.") 印刷 (「tfjobの作成を開始」) job_name = "arena-sdk-distributed-test" job_type = TrainingJobType.TFTrainingJob 試してみてください。 # トレーニングジョブを構築する job = TensorflowJobBuilder().with_name(job_name)\ . witch_workers(1)\ . with_gpus(1)\ . witch_worker_image("tensorflow/tensorflow:1.5.0-devel-gpu")\ . witch_ps_image("tensorflow/tensorflow:1.5.0-devel")\ . witch_ps_count(1)\ . with_datas({"fashion-demo-pvc":"/data"})\ . enable_tensorboard()\ . with_sync_mode("git")\ . with_sync_source(" https://codeup.aliyun.com/60b4cf5c66bba1c04b442e49/tensorflow-fashion-mnist-sample.git ")\ # Gitリポジトリのアドレス。 . with_envs({\ "GIT_SYNC_USERNAME":"USERNAME", \ # Gitリポジトリのユーザー名。 "GIT_SYNC_PASSWORD":"PASSWORD",\ # Gitリポジトリのパスワード。 "TEST_TMPDIR":"/",\ })\ . with_command("python code/tensorflow-fashion-mnist-sample/tf-distributed-mnist.py").build() # トレーニングジョブが存在しない場合は作成します client.training().get(job_name, job_type): print (「ジョブ {} が作成されました。削除する」. format(job_name)) client.training().delete(job_name, job_type) time.sleep (3) output = client.training().submit(job) プリント (出力) count = 0 # 実行中のトレーニングジョブを待っています while True: カウント> 160の場合: 例外発生 (「実行中の待機ジョブのタイムアウト」) jobInfo = client.training().get(job_name,job_type) if jobInfo.get_status() == TrainingJobStatus.TrainingJobPending: 印刷 (「ジョブのステータスは保留中、待機中... 」) カウント=カウント + 1 time.sleep(5) continue print (「現在のステータスはジョブ {} の {} です」. format(jobInfo.get_status().value,job_name)) break # トレーニングのジョブログを取得する logger = LoggerBuilder().with_accepter(sys.stdout).with_follow().with_since("5m") # jobInfo.get_instances()[0].get_logs(logger) # トレーニングジョブ情報を表示する print(str(jobInfo)) # トレーニングジョブを削除する # client.training().delete(job_name, job_type) eとしてArenaExceptionを除いて: プリント (e) main()
namespace
: この例では、トレーニングジョブはdemo-ns名前空間に送信されます。with_sync_source
: Gitリポジトリのアドレス。with_envs
: Gitリポジトリのユーザー名とパスワード。
ノートブックの
アイコンをクリックします。
期待される出力:
2021-11-02/08:57:28 DEBUG util.py[line:19] - executeコマンド: [arena get-namespace=demo-ns-arena-namespace=arena-system-loglevel=info arena-sdk-distributed-test-type=tfjob -o json] 2021-11-02/08:57:28 DEBUG util.py[line:19] - executeコマンド: [arena submit-namespace=demo-ns-arena-namespace=arena-system-loglevel=info tfjob-name=arena-sdk-distributed-test-workers=1-gpus-worker-image=tensorflow/tensorflow:1.5.0-devel-gpu-ps-image=tensorflow/tensorflow:1.5.0-devel-ps=1-data=fashion-demo-pvc:/data-tensorboard-sync-mode=git-sync-source=https://codeup.aliyun.com/60b4cf5c66bba1c04b442e49/tensorflow-fashion-mnist-sample.git -env=GIT_SYNC_USERNAME=kubeai /@ sample-IR tf-distributed-mnist.py //TEm_sample-pyth123 アリーナのテストを開始する-python-sdk 作成ArenaClient success. tfjobの作成を開始する 2021-11-02/08:57:29 DEBUG util.py[line:19] - executeコマンド: [arena get-namespace=demo-ns-arena-namespace=arena-system-loglevel=info arena-sdk-distributed-test-type=tfjob -o json] service/arena-sdk-distributed-test-tensorboard created deployment.apps/arena-sdk-distributed-test-tensorboard created 作成されたtfjob.kubeflow.org/arena-sdk-distributed-test ジョブのステータスは保留中、待機中です... 2021-11-02/09:00:34 DEBUG util.py[line:19] - executeコマンド: [arena get-namespace=demo-ns-arena-namespace=arena-system-loglevel=info arena-sdk-distributed-test-type=tfjob -o json] 現在の状況はRUNNING of job arena-sdk-distributed-testです。{ "allocated_gpus": 1, "chief_name": "arena-sdk-distributed-test-worker-0" 、 "duration": "185s" 、 "instances": [ { "age": "13s" 、 "gpu_metrics": [], "is_chief": false、 "name": "arena-sdk-distributed-test-ps-0" 、 "node_ip": "192.168.5.8" 、 "node_name": "cn-beijing.192.168.5.8" 、 "owner": "arena-sdk-distributed-test" 、 "owner_type": "tfjob" 、 "request_gpus": 0, "status": "Running" }, { "age": "13s" 、 "gpu_metrics": [], "is_chief": true、 "name": "arena-sdk-distributed-test-worker-0" 、 "node_ip": "192.168.5.8" 、 "node_name": "cn-beijing.192.168.5.8" 、 "owner": "arena-sdk-distributed-test" 、 "owner_type": "tfjob" 、 "request_gpus": 1, "status": "Running" } ], "name": "arena-sdk-distributed-test" 、 "namespace": "demo-ns" 、 "priority": "N/A" 、 "request_gpus": 1, "tensorboard": "http:// 192.168.5.6:31068" 、 "type": "tfjob" }
ステップ4: モデルのトレーニング
次の例を参照して、スタンドアロンのTensorFlowトレーニングジョブ、分散TensorFlowトレーニングジョブ、流体加速トレーニングジョブ、およびACKのAIジョブスケジューラによって加速された分散トレーニングジョブを送信します。
例1: スタンドアロンTensorFlowトレーニングジョブの送信
ノートブックを使用してモデルを開発し、モデルを保存した後、ArenaまたはAI開発者コンソールを使用してトレーニングジョブを送信できます。
方法1: Arenaを使用してスタンドアロンのTensorFlowトレーニングジョブを送信する
アリーナ \
送信 \
tfjob \
-n ns1 \
-- name=fashion-mnist-arena \
-- data=fashion-mnist-jackwg-pvc:/root/data/ \
-- env=DATASET_PATH=/root/data/ \
-- env=MODEL_PATH=/root/saved_model \
-- env=MODEL_VERSION=1 \
-- env=GIT_SYNC_USERNAME=<GIT_USERNAME> \
-- env=GIT_SYNC_PASSWORD=<GIT_PASSWORD> \
-- sync-mode=git \
-- sync-source=https://codeup.aliyun.com/60b4cf5c66bba1c04b442e49/tensorflow-fashion-mnist-sample.git \
-- image="tensorflow/tensorflow:2.2.2-gpu" \
"python /root/code/tensorflow-fashion-mnist-sample/train.py -- log_dir=/training_logs"
方法2: AI Developer Consoleを使用してスタンドアロンのTensorFlowトレーニングジョブを送信する
データソースを設定します。 詳細については、「データセットの設定」をご参照ください。
下表に一部のパラメーターを示します。
パラメーター
例
必須
名前
ファッション-デモ
必須
名前空間
デモ-ns
必須
PersistentVolumeClaim
fashion-demo-pvc
必須
ローカルディレクトリ
/ルート /データ
任意
ソースコードを設定します。 詳細については、「ソースコードリポジトリの設定」をご参照ください。
パラメーター
例
必須
名前
ファッションgit
必須
Gitリポジトリ
https://codeup.aliyun.com/60b4cf5c66bba1c04b442e49/tensorflow-fashion-mnist-sample.git
必須
デフォルトブランチ
master
任意
ローカルディレクトリ
/root/
任意
Gitユーザー
プライベートGitリポジトリのユーザー名。
任意
Git secret
プライベートGitリポジトリのパスワード。
任意
スタンドアロンのTensorFlowトレーニングジョブを送信します。 詳細については、「TensorFlowトレーニングジョブの送信」をご参照ください。
ジョブパラメーターを設定したら、[送信] をクリックします。 トレーニングジョブがジョブリストに表示されます。 ジョブのパラメーターについて次の図に示します。
パラメーター
説明
ジョブ名
この例では、fashion-tf-uiが使用されます。
ジョブタイプ
この例では、TFスタンドアロンが選択されています。
名前空間
この例では、demo-nsが選択されています。 データセットが属する名前空間を選択する必要があります。
データ設定
この例では、fashion-demoが選択されています。 手順1で設定したデータソースを選択する必要があります。
コード設定
この例では、fashion-gitが選択されています。 手順2で設定したソースコードを選択する必要があります。
コードブランチ
この例では、masterが指定されています。
実行コマンド
この例では、次のコマンドが指定されています。
"export DATASET_PATH=/root/data/ &export MODEL_PATH=/root/saved_model &&export MODEL_VERSION=1 &&python /root/code/tensorflow-fashion-mnist-sample/train"
。Private Git
プライベートGitリポジトリを使用するには、まずプライベートGitリポジトリのユーザー名とパスワードを指定する必要があります。
インスタンス数
デフォルト値は 1 です。
[イメージ]
この例では、
tensorflow/tensorflow:2.2.2-gpu
が指定されています。画像プルの秘密
プライベートイメージリポジトリからイメージを取得するには、まずシークレットを作成する必要があります。
CPU (コア)
デフォルト値: 4。
メモリ (GB)
デフォルト値: 8。
Arenaコマンドの詳細については、「Arenaを使用してTensorFlowトレーニングジョブを送信する」をご参照ください。
ジョブを送信した後、ジョブログを確認します。
AI開発者コンソールの左側のナビゲーションウィンドウで、[ジョブリスト] をクリックします。
[ジョブリスト] ページで、送信したジョブの名前をクリックします。
詳細ページで、[インスタンス] タブをクリックします。 表示するインスタンスを見つけて、[操作] 列の [ログ] をクリックします。
例:
train_images.shape :( 60000、28、28、1) 、float64の test_images.shape :( 10000, 28, 28, 1) 、of float64 モデル: "sequential" _________________________________________________________________ レイヤー (タイプ) 出力形状Param# ================================================================= Conv1 (Conv2D) (なし、13、13、8) 80 _________________________________________________________________ flatten (フラット) (なし、1352) 0 _________________________________________________________________ Softmax (密) (なし、10) 13530 ================================================================= 総パラメーター: 13,610 訓練可能なパラメータ: 13,610 トレーニング不可能なパラメータ: 0 _________________________________________________________________ エポック1/5 2021-08-01 14:21:17.532237: E tensorflow/core/profiler/internal/gpu/cupti_tracer.cc:1430] 関数cupti_interface_->EnableCallback( 0、subscriber_、CUPTI_CB_DOMAIN_DRIVER_API、cbid) エラーCUPTI_ERRO_INVALID_PARAMETER 2021-08-01 14:21:17.532390: tensorflow/core/profiler/internal/gpu/device_tracer.cc:216] GpuTracerは0個のコールバックapiイベントと0個のアクティビティイベントを収集しました。 2021-08-01 14:21:17.533535: 私はtensorflow/core/profiler/rpc/client/save_profile.cc:168を作成するディレクトリ: /training_logs/train/plugins/profile/2021_08_01_14_21_17 2021-08-01 14:21:17.533928: tensorflow/core/profiler/rpc/client/save_profile.cc:174] trace.json.gzのgzipツールデータを /training_logs/train/plugins/profile/2021_08_01_14_21_17/fashion-mnist-arena-chief-0.trace.json.gzにダンプ 2021-08-01 14:21:17.534251: tensorflow/core/profiler/utils/event_span.cc:288] ステップイベントの生成には0ミリ秒かかりました 2021-08-01 14:21:17.534961: 私はtensorflow/python/profiler/internal/profiler_wrapper.cc:87] ディレクトリを作成する: /training_logs/train/plugins/profile /2021_08_08_17_2021_21_17にツールデータをダンプしました。input_pipeline.pbのツールデータを /training_logs/train/plugins/profile/2021_08_01_14_21_17/fashion-mnist-arena-chief-0.input_pipeline.pbにダンプ tensorflow_stats.pbのツールデータを /training_logs/train/plugins/profile/2021_08_01_14_21_17/fashion-mnist-arena-chief-0.tensorflow_stats.pbにダンプ kernel_stats.pbのツールデータを /training_logs/train/plugins/profile/2021_08_01_14_21_17/fashion-mnist-arena-chief-0.kernel_stats.pbにダンプ 1875/1875 [==============================] - 3s 2ms /ステップロス: 0.5399精度: 0.8116 エポック2/5 1875/1875 [==============================] - 3s 2ms /ステップロス: 0.4076精度: 0.8573 エポック3/5 1875/1875 [==============================] - 3s 2ms /ステップロス: 0.3727精度: 0.8694 エポック4/5 1875/1875 [==============================] - 3s 2ms /ステップロス: 0.3512精度: 0.8769 エポック5/5 1875/1875 [==============================] - 3s 2ms /ステップロス: 0.3351精度: 0.8816 313/313 [==============================] - 0s 1ms /ステップロス: 0.3595精度: 0.8733 2021-08-01 14:21:34.820089: W tensorflow/python/util/util.cc:329] セットは現在シーケンスとは見なされていませんが、今後変更される可能性があるため、使用を避けることを検討してください。 警告: tensorflow: /usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/resource_variable_ops.pyから: 1817: BaseResourceVariable.__init__ (tensorflow.python.ops.resource_variable_opsから) を呼び出します。 更新のための指示: Kerasを使用する場合は、*_constraint引数をレイヤーに渡します。 テスト精度: 0.8733000159263611 export_path = /root/saved_model/1 保存されたモデルの成功
TensorBoardでデータを表示します。
kubectl port-forwardコマンドを使用して、ローカルポートをTensorBoardサービスにマップできます。 MaxComputeとVPC間の接続を確立するには、次の操作を実行します。
次のコマンドを実行して、TensorBoardサービスのIPアドレスを照会します。
kubectl get svc -n demo-ns
期待される出力:
名タイプCLUSTER-IP EXTERNAL-IPポート年齢 tf-dist-arena-tensorboard NodePort 172.16.XX.XX <none> 6006:32226/TCP 80m
次のコマンドを実行して、ローカルポートをTensorBoardサービスにマップします。
kubectl port-forward svc/tf-dist-arena-tensorboard -n demo-ns 6006:6006
期待される出力:
転送から127.0.0.1:6006 -> 6006 [::1]:6006 -> 6006からの転送 6006の接続の取り扱い 接続の取り扱い6006
ブラウザのアドレスバーに
http:// localhost:6006/
と入力して、TensorBoardのデータを表示します。
例2: 分散TensorFlowトレーニングジョブの送信
方法1: Arenaを使用して分散TensorFlowトレーニングジョブを送信する
次のコマンドを実行して、Arenaを使用して分散TensorFlowトレーニングジョブを送信します。
アリーナはtf \を提出します -nデモ-ns \ -- name=tf-dist-arena \ -- working-dir=/root/ \ -- data fashion-mnist-pvc:/data \ -- env=TEST_TMPDIR=/ \ -- env=GIT_SYNC_USERNAME=kubeai \ -- env=GIT_SYNC_PASSWORD=kubeai @ ACK123 \ -- env=GIT_SYNC_BRANCH=master \ -- gpus=1 \ -- workers=2 \ -- worker-image=tensorflow/tensorflow:1.5.0-devel-gpu \ -- sync-mode=git \ -- sync-source=https://codeup.aliyun.com/60b4cf5c66bba1c04b442e49/tensorflow-fashion-mnist-sample.git \ -- ps=1 \ -- ps-image=tensorflow/tensorflow:1.5.0-devel \ -- tensorboard \ "python code/tensorflow-fashion-mnist-sample/tf-distributed-mnist.py -- log_dir=/training_logs"
次のコマンドを実行して、TensorBoardサービスのIPアドレスを照会します。
kubectl get svc -n demo-ns
期待される出力:
名タイプCLUSTER-IP EXTERNAL-IPポート年齢 tf-dist-arena-tensorboard NodePort 172.16.204.248 <none> 6006:32226/TCP 80m
次のコマンドを実行して、ローカルポートをTensorBoardサービスにマップします。
TensorBoardを表示するには、kubectl port-forwardコマンドを使用してローカルポートをTensorBoardサービスにマップします。
kubectl port-forward svc/tf-dist-arena-tensorboard -n demo-ns 6006:6006
期待される出力:
転送から127.0.0.1:6006 -> 6006 [::1]:6006 -> 6006からの転送 6006の接続の取り扱い 接続の取り扱い6006
ブラウザのアドレスバーに
http:// localhost:6006/
と入力して、TensorBoardのデータを表示します。
方法2: AI開発者コンソールを使用して分散TensorFlowトレーニングジョブを送信する
データソースを設定します。 詳細については、「データセットの設定」をご参照ください。
この例では、データソースの設定は1で使用されている設定と同じです。
ソースコードを設定します。 詳細については、「ソースコードリポジトリの設定」をご参照ください。
この例では、ソースコードの構成は2で使用されるものと同じです。
分散Tensorflowトレーニングジョブを送信します。 詳細については、「TensorFlowトレーニングジョブの送信」をご参照ください。
ジョブパラメーターを設定したら、[送信] をクリックします。 トレーニングジョブがジョブリストに表示されます。 ジョブのパラメーターについて次の図に示します。
パラメーター
説明
ジョブ名
この例では、fashion-ps-uiが使用されます。
ジョブタイプ
この例では、TF Distributedが選択されています。
名前空間
この例では、demo-nsが選択されています。 データセットが属する名前空間を選択する必要があります。
データ設定
この例では、fashion-demoが選択されています。 手順1で設定したデータソースを選択する必要があります。
コード設定
この例では、fashion-gitが選択されています。 手順2で設定したソースコードを選択する必要があります。
実行コマンド
この例では、次のコマンドが指定されています。
"export TEST_TMPDIR=/root/ &python code/tensorflow-fashion-mnist-sample/tf-distributed-mnist.py -- log_dir=/training_logs"
。[イメージ]
[リソース] セクションの [ワーカー] タブで、[イメージ] を
tensorflow/tensorflow:1.5.0-devel-gpu
に設定します。[リソース] セクションの [PS] タブで、[イメージ] を
tensorflow/tensorflow:1.5.0-devel
に設定します。
Arenaコマンドの詳細については、「Arenaを使用してTensorFlowトレーニングジョブを送信する」をご参照ください。
TensorBoardでデータを表示します。 詳細については、「方法1: Arenaを使用して分散TensorFlowトレーニングジョブを送信する」の4の2をご参照ください。
例3: Fluid-acceleratedトレーニングジョブの送信
この例では、データセットはAIダッシュボードで高速化され、高速化されたデータセットを使用するトレーニングジョブが送信されます。 結果は、トレーニングジョブを完了するのに必要な時間が短縮されることを示しています。 手順:
管理者はAIダッシュボードでデータセットを高速化します。
開発者はArenaを使用して、高速化データセットを使用するトレーニングジョブを送信します。
Arenaを使用して、トレーニングジョブを完了するのに必要な時間を照会します。
データセットを高速化します。
手順2: データセットの作成でfashion-demo-pvcを高速化した場合は、この手順をスキップしてください。 データセットを高速化する方法の詳細については、「OSSに基づく高速化データセットの作成」をご参照ください。
高速化されたデータセットを使用するトレーニングジョブを送信します。
開発者は、高速化データセットを使用するトレーニングジョブをdemo-ns名前空間に送信します。 高速化されたデータセットを使用するジョブの構成と、通常のデータセットを使用するジョブの構成は、次のパラメーター設定が異なります。
-- data
: 高速化されたVPC。この例ではfashion-demo-pvc-acc
です。-- env=DATASET_PATH
: データセットPVCのマウントパス (この例では /root/data/ in-- data
) 、およびPVCの名前 (この例ではfashion-demo-pvc-acc) 。
アリーナ \ 送信 \ tfjob \ -nデモ-ns \ -- name=fashion-mnist-fluid \ -- data=fashion-demo-pvc-acc:/root/data/ \ -- env=DATASET_PATH=/root/data/fashion-demo-pvc-acc \ -- env=MODEL_PATH=/root/saved_model \ -- env=MODEL_VERSION=1 \ -- env=GIT_SYNC_USERNAME =${ GIT_USERNAME} \ -- env=GIT_SYNC_PASSWORD =${ GIT_PASSWORD} \ -- sync-mode=git \ -- sync-source=https://codeup.aliyun.com/60b4cf5c66bba1c04b442e49/tensorflow-fashion-mnist-sample.git \ -- image="tensorflow/tensorflow:2.2.2-gpu" \ "python /root/code/tensorflow-fashion-mnist-sample/train.py -- log_dir=/training_logs"
次のコマンドを実行して、2つのトレーニングジョブを完了するのに必要な時間を比較します。
アリーナリスト-nデモ-ns
期待される出力:
NAME STATUS TRAINER DURATION GPU (要求された) GPU (割り当てられた) ノード ファッション-mnist-fluid成功したTFJOB 33s 0 N/A 192.168.5.7 ファッション-ミニスト-アリーナ成功したTFJOB 3m 0 N/A 192.168.5.8
arena listコマンドの出力は、Fluid-acceleratedトレーニングジョブを完了するのに33秒かかるのに対し、通常のデータセットを使用するトレーニングジョブを完了するには3分かかることを示しています。 両方のジョブは同じコードで同じノードで実行されます。
例4: ACKのAIジョブスケジューラを使用して分散トレーニングジョブを高速化
ACKは、AIおよびビッグデータコンピューティング向けに最適化されたAIジョブスケジューラを提供します。 AIジョブスケジューラは、ギャングスケジューリング、容量スケジューリング、およびトポロジ認識スケジューリングをサポートします。 この例では、トポロジ認識GPUスケジューリングが有効になっているトレーニングジョブが使用されます。
AIワークロードの高性能を確保するために、AIジョブスケジューラは、ノード上の異種リソースに関するトポロジ情報に基づいて最適なスケジューリングソリューションを選択します。 情報には、NVLinkとPCIeスイッチを使用してGPUが相互に通信する方法、およびCPUの非均一メモリアクセス (NUMA) トポロジが含まれます。 トポロジ対応GPUスケジューリングの詳細については、「トポロジ対応GPUスケジューリングの概要」をご参照ください。 トポロジ対応CPUスケジューリングの詳細については、「トポロジ対応CPUスケジューリング」をご参照ください。
次の手順を実行して、トポロジ認識GPUスケジューリングが有効になっているトレーニングジョブと、トポロジ認識GPUスケジューリングが無効になっているトレーニングジョブを送信します。 次に、ジョブを完了するのに必要な時間を比較します。
次のコマンドを実行して、トポロジ認識GPUスケジューリングが無効になっているトレーニングジョブを送信します。
アリーナ送信mpi \ -- name=tensorflow-4-vgg16 \ -- gpus=1 \ -- workers=4 \ -- imag e=registry.cn-hangzhou.aliyuncs.com/kubernetes-image-hub/tensorflow-benchmark:tf2.3.0-py3.7-cuda10.1 \ "mpirun -- allow-run-as-root-npy" 4 " -bind-to none -map-by slot -x NCCL_benchseg16 DEBUG=INFO -x NCCL_SOCKET_if_IFNAME=eth0 -x LD_LIBRARY_PATH-m-- mca pta_neb_eptemarks /mot_ethnモデル1-mca-mot_nad_m_n// mobdname 64 -- variable_update=horovod"
トポロジ対応のGPUスケジューリングが有効になっているトレーニングジョブを送信します。
ジョブを実行するノードにラベルを追加する必要があります。 この例では、cn-beijing.192.168.XX.XXノードが使用されます。 ノードを、使用されている実際のノードに置き換えます。
kubectlラベルノードcn-beijing.192.168.XX.XX ack.node.gpu.schedule=topology -- overwrite
次のコマンドを実行して、トポロジ対応のGPUスケジューリングを有効にするために使用される
-- gputopology=true
で設定されたトレーニングジョブを送信します。アリーナ送信mpi \ -- name=tensorflow-topo-4-vgg16 \ -- gpus=1 \ -- workers=4 \ -- gputopology=true \ -- imag e=registry.cn-hangzhou.aliyuncs.com/kubernetes-image-hub/tensorflow-benchmark:tf2.3.0-py3.7-cuda10.1 \ "mpirun -- allow-run-as-root-npy" 4 " -bind-to none -map-by slot -x NCCL_benchseg16 DEBUG=INFO -x NCCL_SOCKET_if_IFNAME=eth0 -x LD_LIBRARY_PATH-m-- mca pta_neb_eptemarks /mot_ethnモデル1-mca-mot_nad_m_n// mobdname 64 -- variable_update=horovod
トレーニングジョブを完了するのに必要な時間を比較します。
次のコマンドを実行して、2つのトレーニングジョブを完了するのに必要な時間を比較します。
アリーナリスト-nデモ-ns
期待される出力:
NAME STATUS TRAINER DURATION GPU (要求された) GPU (割り当てられた) ノード tensorflow-topo-4-vgg16成功したMPIJOB 44s 4 N/A 192.168.4.XX1 tensorflow-4-vgg16-image-warned成功したMPIJOB 2m 4 N/A 192.168.4.XX0
次のコマンドを実行して、トポロジ認識GPUスケジューリングが無効になっているトレーニングジョブの合計GPU処理時間を照会します。
アリーナログtensorflow-topo-4-vgg16 -n demo-ns
期待される出力:
100画像 /秒: 251.7 +/- 0.1 (ジッタ=1.2) 7.262 ---------------------------------------------------------------- 総イメージ /秒: 1006.44
次のコマンドを実行して、トポロジ認識GPUスケジューリングが有効になっているトレーニングジョブの合計GPU処理時間を照会します。
アリーナログtensorflow-4-vgg16-image-warned -n demo-ns
期待される出力:
100画像 /秒: +/- 0.2 (ジッタ=1.5) 7.261 ---------------------------------------------------------------- 総イメージ /秒: 225.50
次の表に、2つのジョブの結果を示します。
トレーニングジョブ | GPUあたりの処理時間 (ns) | 合計GPU処理時間 (ns) | 期間 |
トポロジ対応GPUスケジューリングの有効化 | 56.4 | 225.50 | 44 |
トポロジ対応GPUスケジューリングの無効化 | 251.7 | 1006.44 | 120 |
ノードでトポロジ対応のGPUスケジューリングを有効にすると、通常のGPUスケジューリングを有効にすることはできません。 通常のGPUスケジューリングを再開するには、次のコマンドを実行してノードラベルを変更します。
kubectlラベルノードcn-beijing.192.168.XX.XX0 ack.node.gpu.schedule=default -- overwrite
ステップ5: モデルを管理する
- AI開発者コンソール
へのログイン - AI開発者コンソールの左側のナビゲーションウィンドウで、[モデル管理] をクリックします。
[モデル管理] ページで、[モデルの作成] をクリックします。
[作成] ダイアログボックスで、モデル名、モデルバージョン、ジョブ名を設定します。
この例では、モデル名はfsahion-mnist-demo、モデルバージョンはv1、ジョブ名はtf-singleに設定されています。
[OK] をクリックします。 モデルがページに表示されます。
モデルを評価する場合は、[操作] 列の [新しいモデル評価] をクリックします。
ステップ6: モデルを評価する
クラウドネイティブコンポーネントセットをインストールした後、ArenaまたはAI開発者コンソールを使用して評価ジョブを送信できます。 この例では、Fashion-MNISTデータセットに基づいてトレーニングされたモデルのチェックポイントを評価するために、評価ジョブが送信されます。 手順:
アリーナを使用して、チェックポイントをエクスポートするトレーニングジョブを送信します。
アリーナを使用して評価ジョブを送信します。
AI Developer Consoleを使用して、異なるモデルの評価結果を比較します。
チェックポイントをエクスポートするトレーニングジョブを送信します。
次のコマンドを実行して、アリーナを使用して、チェックポイントをfashion-demo-pvcにエクスポートするトレーニングジョブを送信します。
アリーナ \ 送信 \ tfjob \ -n demo-ns \ # ビジネス要件に基づいて名前空間を変更できます。 -- name=fashion-mnist-arena-ckpt \ -- data=fashion-demo-pvc:/root/data/ \ -- env=DATASET_PATH=/root/data/ \ -- env=MODEL_PATH=/root/data/saved_model \ -- env=MODEL_VERSION=1 \ -- env=GIT_SYNC_USERNAME =${ GIT_USERNAME} \ # Gitリポジトリのユーザー名。 -- env=GIT_SYNC_PASSWORD =${ GIT_PASSWORD} \ # Gitリポジトリのパスワード。 -- env=OUTPUT_CHECKPOINT=1 \ -- sync-mode=git \ -- sync-source=https://codeup.aliyun.com/60b4cf5c66bba1c04b442e49/tensorflow-fashion-mnist-sample.git \ -- image="tensorflow/tensorflow:2.2.2-gpu" \ "python /root/code/tensorflow-fashion-mnist-sample/train.py -- log_dir=/training_logs"
評価ジョブを送信します。
ジョブの配置に使用するイメージを作成します。
モデル評価用のコードを取得します。 kubeai-sdkディレクトリで次のコマンドを実行して、イメージを作成してプッシュします。
dockerビルド。 -t ${DOCKER_REGISTRY}:fashion-mnist docker push ${DOCKER_REGISTRY}: ファッションmnist
次のコマンドを実行して、MySQLへのアクセスを提供するサービスを照会します。
kubectl get svc -n kube-ai ack-mysql
期待される出力:
名タイプCLUSTER-IP EXTERNAL-IPポート年齢 ack-mysql ClusterIP 172.16.XX.XX <none> 3306/TCP 28h
次のコマンドを実行して、Arenaを使用して評価ジョブを送信します。
アリーナ评価モデル \ -- namespace=demo-ns \ -- loglevel=debug \ -- name=evaluate-job \ -- imag e=registry.cn-beijing.aliyuncs.com/kube-ai/kubeai-sdk-demo: ファッションミニスト \ -- env=ENABLE_MYSQL=True \ -- env=MYSQL_HOST=172.16.77.227 \ -- env=MYSQL_PORT=3306 \ -- env=MYSQL_USERNAME=kubeai \ -- env=MYSQL_PASSWORD=kubeai @ ACK \ -- data=fashion-demo-pvc:/data \ -- model-name=1 \ -- model-path=/data/saved_model/ \ -- dataset-path=/data/ \ -- metrics-path=/data/output \ 「python /kubeai/evaluate.py」
説明MySQLにアクセスするには、前の手順で出力からIPアドレスとポートを取得します。
評価結果を比較する。
AI開発者コンソールの左側のナビゲーションウィンドウで、[モデル管理] をクリックします。
[ジョブリスト] セクションで、評価ジョブの名前をクリックしてメトリクスを表示できます。
異なる評価ジョブのメトリックを比較することもできます。
ステップ7: モデルをサービスとしてデプロイする
モデルを開発および評価した後、モデルをサービスとしてデプロイできます。 次の手順では、前述のモデルをtf-servingという名前の推論サービスとして展開する方法について説明します。 Arenaは、TritonやSeldonなどのさまざまなサービスアーキテクチャをサポートしています。 詳細については、「アリーナサーブガイド」をご参照ください。
この例では、ステップ4: モデルのトレーニングでトレーニングされたモデルが使用されます。 モデルは、ステップ2: データセットの作成で使用されるfashion-minist-demo PVCに保存されます。 モデルを他のタイプのストレージに格納する場合は、最初に使用するストレージタイプのPVCを作成する必要があります。
次のコマンドを実行して、Arenaを使用してTensorFlowモデルをTensorFlow Servingにデプロイします。
アリーナはtensorflow \を提供します -- loglevel=debug \ -- namespace=demo-ns \ -- name=ファッション-mnist \ -- model-name=1 \ -- gpus=1 \ -- image=tensorflow/serving:1.15.0-gpu \ -- data=fashion-demo-pvc:/data \ -- model-path=/data/saved_model/ \ -- version-policy=latest
次のコマンドを実行して、デプロイした推論サービスの名前を照会します。
アリーナサーブリスト-n demo-ns
期待される出力:
名前タイプバージョンが必要利用可能なアドレスポートGPU ファッション・ミニストTensorflow 202111031203 1 1 172.16。XX.XX GRPC:8500、RESTFUL:8501 1
[address] 列と [ports] 列のIPアドレスとポートを使用して、クラスター内から推論サービスにリクエストを送信できます。
JupyterでJupyterノートブックを作成し、そのノートブックをクライアントとして使用して、HTTPリクエストをtf-servingサービスに送信します。
この例では、ステップ3: モデルの開発で作成されたJupyterノートブックが使用されています。
ノートブックの初期化に使用172.16コードの
server_ip
フィールドの値として、. XX.XXを指定します。 前の手順でADDRESS列に172.16.XX.XXが返されます。ノートブックの初期化に使用するコードの
server_http_port
フィールドの値として8501を指定します。 ポート8501は、前の手順でPORTS列に返され、RESTful APIを呼び出すために使用されます。
例:
osのインポート gzipのインポート numpyをnpとしてインポートする # matplotlib.pyplotをpltとしてインポートする ランダムにインポート インポートリクエスト jsonのインポート server_ip = "172.16.XX.XX" server_http_port = 8501 dataset_dir = "/root/data/" def load_data(): files = [ 'train-labels-idx1-ubyte.gz '、 'train-images-idx3-ubyte.gz '、 't10k-labels-idx1-ubyte.gz '、 't10k-images-idx3-ubyte.gz' ] パス= [] ファイル内のfnameの場合: paths.append(os.path.join(dataset_dir, fname)) gzip.open (パス [0], 'rb') をlabelpathとして使用する: y_train = np.frombuffer(labelpath.read(), np.uint8, offset=8) gzip.open (パス [1] 、'rb') をimgpathとして使用します。 x_train = np.frombuffer(imgpath.read(), np.uint8, offset=16).reshape(len(y_train), 28,28) gzip.open (パス [2] 、'rb') をlabelpathとして使用する: y_test = np.frombuffer(labelpath.read(), np.uint8, offset=8) gzip.open (パス [3], 'rb') をimgpathとして: x_test = np.frombuffer(imgpath.read(), np.uint8, offset=16).reshape(len(y_test), 28,28) return (x_train, y_train),(x_test, y_test) def show(idx、タイトル): plt.figure() plt.imshow(test_images[idx].reshape(28,28)) plt.axis('off ') plt.title('\n\n{}'.format(title), fontdict={'size': 16}) class_names = ['Tシャツ /トップ' 、'ズボン' 、'プルバー' 、'ドレス' 、'コート' 、 「サンダル」、「シャツ」、「スニーカー」、「バッグ」、「アンクルブーツ」] (train_images, train_labels), (test_images, test_labels) = load_data() train_images = train_images / 255.0 test_images = test_images / 255.0 # モデルに供給するための形状変更 train_images = train_images.reshape(train_images.shape[0], 28,28, 1) test_images = test_images.reshape(test_images.shape[0], 28,28, 1) print('\ntrain_images.shape: {}, of {}'.format(train_images.shape, train_images.dtype)) プリント ('test_images.shape: {}, of {}'.format(test_images.shape, test_images.dtype)) rando = random.randint (0,len(test_images)-1) # show(rando, 'An Example Image: {}'.format(class_names[test_labels[rando]])) #! pip install -qリクエスト # リクエストのインポート # headers = {"content-type": "application/json"} # json_response = requests.post('http:// localhost:8501/v1/models/fashion_model:predict' 、data=data、headers=headers) # predictions = json.loads(json_response.text)['predictions'] # show(0, 'モデルはこれが {} (クラス {}) だと思っていましたが、実際には {} (クラス {}) でした '.format () # class_names[np.argmax (予測 [0])] 、np.argmax (予測 [0]) 、class_names[test_labels[0]] 、test_labels[0])) def request_model (データ): headers = {"content-type": "application/json"} json_response = requests.post('http:// {}:{}/v1/models/1:predict'.format(server_ip, server_http_port), data=data, headers=headers) プリント ('======= response:' 、json_response、json_response.text) predictions = json.loads(json_response.text)['predictions'] print('モデルはこれが {} (class {}) だと思っていましたが、実際には {} (class {})'.format(class_names[np.argmax(predictions[0])] 、np.argmax(predictions[0]) 、class_names[test_labels[0]] 、test_labels[0]))) # show(0, 'モデルはこれが {} (クラス {}) だと思っていましたが、実際には {} (クラス {}) でした '.format () # class_names[np.argmax (予測 [0])] 、np.argmax (予測 [0]) 、class_names[test_labels[0]] 、test_labels[0])) # def request_model_version (データ): # headers = {"content-type": "application/json"} # json_response = requests.post('http:// {}:{}/v1/models/1/version/1:predict'.format(server_ip、server_http_port) 、data=data、headers=headers) # print('======= response:' 、json_response、json_response.text) # predictions = json.loads(json_response.text) # 範囲内のi (0,3): # show(i、'モデルはこれが {} (クラス {}) だと思っていましたが、実際には {} (クラス {}) でした'.format () # class_names[np.argmax(predictions[i])] 、np.argmax(predictions[i]) 、class_names[test_labels[i]] 、test_labels[i])) data = json.dumps({"signature_name": "serving_default", "instances": test_images[0:3].tolist()}) print('Data: {} ... {}'.format(data[:50], data[len(data)-52:]))) # request_model_version (データ) request_model (データ)
ノートブックの
アイコンをクリックします。 次の出力が返されます。
でした。train_images.shape :( 60000、28、28、1) 、float64の test_images.shape :( 10000, 28, 28, 1) 、of float64 データ: {"signature_name": "serving_default", "instances": ... [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0]]]} ======== response: <レスポンス [200]> { "predictions": [[7.42696e-07, 6.9901237556e-09, 2.669364452e-07, 2.27735413e-07, 4.0373439e-07, 7.27086217e-06, 0.0316713452, 0.0010733594, 0.962337255], [0.00685342, 1.854164260764e-08,-0.00613868702, 3.47e-106, 0.9266119 7.98738e-09、0.000122893631、4.85748023e-05、1.50353979e-10、3.57102294e-07、1.89657579e-09、4.4604468e-07、9.23274524e-09] ] } モデルはこれがアンクルブーツ (クラス9) だと思っていましたが、実際にはアンクルブーツ (クラス9)
よくある質問
Jupyterノートブックコンソールによく使用されるソフトウェアをインストールするにはどうすればよいですか?
一般的に使用されるソフトウェアをJupyterノートブックコンソールにインストールするには、次のコマンドを実行します。
apt-get install ${ソフトウェア名}
Jupyterノートブックコンソールで文字化けの問題を修正するにはどうすればよいですか?
次の内容に基づいて /etc/localeファイルを変更し、ターミナルを再度開きます。
LC_CTYPE="da_DK.UTF-8" LC_NUMERIC="da_DK.UTF-8" LC_TIME="da_DK.UTF-8" LC_COLLATE="da_DK.UTF-8" LC_MONETARY="da_DK.UTF-8" LC_MESSAGES="da_DK.UTF-8" LC_PAPER="da_DK.UTF-8" LC_NAME="da_DK.UTF-8" LC_ADDRESS="da_DK.UTF-8" LC_TELEPHONE="da_DK.UTF-8" LC_MEASUREMENT="da_DK.UTF-8" LC_IDENTIFICATION="da_DK.UTF-8" LC_ALL=