HUOXIU

TensorFlow ディープラーニングタスクを実行する vSphere Bitfusion

表紙写真は北京オリンピック公園で撮影されました。


この記事では、Kubernetes の vSphere 7 に組み込まれている Bitfusion 機能を使用して、アプリケーションがリモート GPU リソースを使用できるようにする方法について説明します。


(この記事の著者は VMware Cloud Native Labs のエンジニアであり、最初に VMware China R&D Center で公開されました。)


背景紹介

AI技術の急速な発展に伴い、ますます多くの企業がAIをビジネスに活用しています。現在、クラウドAIコンピューティングは、主にGPU、FPGA、AI ASICチップという3種類のAIアクセラレータによって提供されています。これらのアクセラレータは非常に高いパフォーマンスを誇りますが、コストが高く、異機種混在環境におけるアクセラレーション管理とスケジューリングが不十分であるという問題があります。多くの企業は効率的なアクセラレータリソースプールを構築できず、これらの高価なアクセラレータリソースを独占的に使用せざるを得ず、結果としてリソース利用率の低下と高コスト化につながっています。


GPUを例に挙げると、革新的なBitfusion GPU仮想化技術により、ユーザーはデータセンター内の任意のサーバー上で、タスクを変更することなくAIアクセラレーターを透過的に共有・利用できるようになります。これにより、リソース利用率が向上するだけでなく、AIアプリケーションの導入が大幅に容易になり、データセンターレベルのAIアクセラレーターリソースプールが構築されます。


Bitfusionは、リモートGPUプールを提供することで、これらの問題への対処を支援します。BitfusionはGPUを第一級オブジェクトとして扱い、従来のコンピューティングリソースと同様に抽象化、パーティション分割、自動化、共有を可能にします。一方、Kubernetesは機械学習ワークロードのデプロイと管理のためのプラットフォームとなっています。


本記事では、新しく開発された Bitfusion Device Plugin を利用して、Kubernetes 上で Bitfusion が提供する GPU リソース プールを素早く利用し、人気の TensorFlow ディープラーニング開発を行う方法を紹介します。


概念理解
これら 2 つの Kubernetes モジュールについて簡単に紹介します。

  • 拡張リソース:カスタムリソースを拡張する方法です。リソースの名前と総量はAPIサーバーに報告されます。スケジューラは、そのリソースを使用するポッドの作成と削除に基づいて利用可能なリソースを増減し、スケジュール時にリソース要件を満たすノードがあるかどうかを判断します。現在、拡張リソースの増減単位は整数である必要があります。例えば、1 GPUを割り当てることはできますが、0.5 GPUを割り当てることはできません。この機能は、Opaque整数リソースを置き換え、一部名称を変更しただけなので、バージョン1.8では安定しています。


  • デバイスプラグイン:汎用的なデバイスプラグインメカニズムと標準デバイスAPIインターフェースを提供します。これにより、デバイスメーカーは、Kubeletのメインラインコードを変更することなく、対応するAPIインターフェースを実装するだけで、GPU、FPGA、高性能NIC、InfiniBandなどの様々なデバイスへのサポートを拡張できます。この機能はKubernetes 1.8および1.9ではアルファ版で提供されており、1.10ではベータ版として提供されます。この機能は、フィーチャーゲート(つまり、`--feature-gates=DevicePlugins=true` で設定)を介して有効化する必要があります。


図に示すように、現在の処理レイヤーはデバイスプラグインを介してDSLRを制御することでポッドのリソースを制御します。そして、ポッド内のBitfusionクライアントとBitfusionサーバーはCUDAドライバーレベルで連携します。Bitfusionクライアントのソフトウェアスタックには、クライアント上のすべてのCUDAサービスアクセスをインターセプトし、データとサービスリクエストをBitfusionサーバーに送信してネットワーク経由で処理するCUDAドライバープロキシがあります。


Bitfusionデバイスプラグインのインストールと使用手順
以下の例では、Kubernetes v1.17.5とUbuntu 18.04をインストール環境として、Bitfusion Device Pluginを用いたベンチマークテスト用のTensorFlow環境を構築する方法を説明します。現在、プロジェクトとコンテナイメージは社内のR&Dサーバーでホストされています。サーバーにアクセスできない場合は、VMwareのカスタマー担当者までお問い合わせください。

まず、Bitfusion Device Plugin プロジェクトをダウンロードします。

プロジェクトコードとbitfusion-baseは現在公開されていません。弊社またはカスタマーサポートまでご連絡いただければ、入手いただけます。入手後は、以下の手順に進んでください。

まず、デバイスプラグインのDockerイメージをビルドする必要があります。プラットフォーム全体のパフォーマンスを把握したいので、ベンチマークをいくつか実行します。用意したDockerfileからDockerイメージをビルドできます。

docker build -f bitfusion-device-plugin/Dockerfile -t bitfusion_device_plugin/bitfusion-device:v0. 1

 FROM bitfusion-base:v0.1

RUN apt install curl -y
RUN \
mkdir -p /goroot && \
curl https://storage.googleapis.com/golang/go1 .9 .linux-amd64.tar.gz | tar xvzf - -C /goroot --strip-components=1
# Set environment variables.
ENV GOROOT /goroot
ENV GOPATH /gopath
ENV PATH $GOROOT/ bin :$GOPATH/ bin :$ PATH

# Define working directory.
WORKDIR /gopath/src/bitfusion-device- plugin

COPY . .
RUN go build -o bitfusion-device- plugin
RUN cp bitfusion-device- plugin /usr/ bin /bitfusion-device- plugin \
&& cp *.sh /usr/ bin

CMD [ "./start.sh" ]

次に、Bitfusion デバイス プラグインの YAML ファイルを構成します。

Bitfusionデバイスプラグインは、Kubernetesデバイスプラグインインターフェース仕様に準拠したデバイス拡張プラグインです。bitfusion.io/gpuリソースをKubernetesクラスターにシームレスに追加し、アプリケーションのデプロイ時にコンテナ内でBitfusionを使用できるようになります。


変更内容は次のとおりです。device_plugin.yml ファイル内のイメージを更新します。これにより、デバイスプラグインが Kubernetes ノードに DaemonSet としてインストールされます。


 apiVersion: apps/v1
kind: DaemonSet
metadata:
name: bitfusion-cli-device-plugin
namespace: kube-system
labels:
tier: node
spec:
hostNetwork: true
containers:
- name: device-plugin-ctr
image: bitfusion_device_plugin/bitfusion-device:v0 .1
securityContext:
privileged: true
command: [ "./start.sh" ]
env:
- name: REG_EXP_SFC
valueFrom:
configMapKeyRef:
name: configmap
key: reg- exp
- name: SOCKET_NAME
valueFrom:
configMapKeyRef:
name: configmap
key: socket-name
- name: RESOURCE_NAME
valueFrom:
configMapKeyRef:
name: configmap
key: resource-name
volumeMounts:
- mountPath: "/root/.bitfusion"
name: bitfusion-cli
- mountPath: /gopath/run
name: docker
- mountPath: /gopath/proc
name: proc
- mountPath: "/root/.ssh/id_rsa"
name: ssh-key
- mountPath: "/var/lib/kubelet"
name: kubelet-socket
- mountPath: "/etc/kubernetes/pki"
name: pki
volumes:
- name: bitfusion-cli
hostPath:
path : "/root/.bitfusion"
- name: docker
hostPath:
path : /var/run
- name: proc
hostPath:
path : /proc
- hostPath:
path : "/root/.ssh/id_rsa"
name: ssh-key
- hostPath:
path : "/var/lib/kubelet"
name: kubelet-socket
- hostPath:
path : "/etc/kubernetes/pki"
name: pki

次に、次のコマンドを使用してデプロイします。

kubeclt apply -f bitfusion-device-plugin/device_plugin.yml

実行後、しばらくお待ちください。デプロイが成功すると、Bitfusion デバイスプラグインのステータスが「実行中」となり、ログに現在のデバイスプラグインのステータスが表示されます。


ベンチマークテスト用のTensorFlowイメージを構築する
bitfusion-base イメージと事前にビルドされた bitfusion-tfl-cli イメージを提供しており、これらを直接プルして使用することも、必要に応じて独自にビルドすることもできます。

docker build -f bitfusion-device-plugin/docker/bitfusion-tfl-cli/Dockerfile -t bitfusion-tfl-cli:v0. 1

 FROM bitfusion- base :v0 .1
RUN conda install tensorflow-gpu== 1.13.1

pod.yaml にタグを追加し、次のようにパラメータを変更します。

  • リソース制限: この設定では、アプリケーションが使用できる bitfusion.io/gpus の数を構成できます。


ポッドbitfusion-device-plugin/example/pod/pod.yamlを構成する

 ---
apiVersion: v1
kind: ConfigMap
metadata:
name: bfs-pod-configmap
---

apiVersion: v1
kind: Pod
metadata:
name: bfs-demo
labels:
purpose: device-demo
spec:
hostNetwork: true
containers:
- name: demo
image: bitfusion-tfl-cli:v0.1
imagePullPolicy: Always
workingDir: /root
securityContext:
privileged: true
command: [ "/bin/bash" , "-c" , "--" ]
args: [ "python /benchmarks/scripts/tf_cnn_benchmarks/tf_cnn_benchmarks.py
--local_parameter_device=gpu
--batch_size=32
--model=inception3 "
]
volumeMounts:
- mountPath: "/root/.bitfusion"
name: config-volume
resources:
limits:
bitfusion.io/gpu: 1
volumes:
- name: config-volume
hostPath:
path: "/root/.bitfusion"

テストのためにKubernetes上でTensorFlowベンチマークを実行する

TensorFlowには独自の公式ベンチマーク( tensorflow/benchmarks )があり、 ResNet50、ResNet152、Inception3、VGG16、GoogleNet、AlexNetなどのモデルを含むtf_cnn_benchmarksが含まれています。いくつかのパラメータを指定するだけでテストを開始できます。


ここでは、ベンチマーク テストに Inception3 モデルを選択し、ポッド内の BitFusion クライアントが BitFusion サーバーに正常に接続できるかどうかを観察します。


 kubeclt apply -f bitfusion-device-plugin/example/pod/pod.yaml


実行後、しばらく待つと、デフォルトのプロジェクトに bfs-demo Pod が表示されます。

デプロイメントが成功すると、Pod のログに次の内容が表示されます。