|
表紙写真は北京オリンピック公園で撮影されました。
この記事では、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-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 のログに次の内容が表示されます。
|