0.5から始める機械学習

Machine Learning, Deep Learning, Computer Vision に関する備忘録

deepopsを使ったGPUクラスター(kubernetes)の構築

今日は学習基盤となるGPUクラスター(kubernetes)をdeepopsを使って簡単に構築する方法についてまとめます。

特に企業勤めでproxy周りの設定が必要なことを想定して、そのあたりの設定についても詳しく書いて行きたいと思います。

deepops

deepopsは、NVIDIAOSSとして提供しているGPUクラスター作成用のツール群です。

実体としては必要な機能をインストールするためのシェルおよびAnsibleの集合体となっています。

deepopsの中から必要なスクリプトを実行することで、各ノードPCにGPU処理を可能にするためのnvidia-dockerなどがインストールされたkubernetesベースのGPUクラスターを構築することができます。

deepopsではkubernetesだけでなく、SlurmベースでもGPUクラスターを作成できますが、今回はkubernetesベースで話を進めます

事前準備

GPUクラスターを立ち上げるためには最低3台(2台がGPUクラスター用、1台はGPUクラスターのPCに設定を遠隔で反映させる用)必要になります。

  • master(Ubuntu18.04): 1台以上
    • kubernetesのマスター。これが計算用に使われる訳ではないので注意。
  • worker(Ubuntu18.04): 1台以上
    • 計算用PC。GPUはリッチなものを搭載しましょう。
  • provisioner: 1台

後ほどGPUクラスター構築時に各PCへユーザー名とパスワードでsshログインをするため、同一ユーザー名、パスワードにしておきましょう。

1. deepopsのダウンロード

注意: この項以降はprovisioner PCで行います

また、20.06 versionでの解説になります!

https://github.com/NVIDIA/deepops/blob/20.06/docs/getting-started.md

公式のGetting startを参考に、deepopsのダウンロードおよびタグのチェックアウトを実施。

git clone https://github.com/NVIDIA/deepops.git
cd deepops
git checkout tags/20.06

以降は下記の設定を参考

https://github.com/NVIDIA/deepops/blob/20.06/docs/kubernetes-cluster.md

2. provisionerの設定

provisioner自体の設定を実施、Ansibleやproxyの設定をしてくれるスクリプトを実行します。

proxyの設定はscript/proxy.shにproxy情報を記載します

# edit the proxy details
# proxyを記載
export http_proxy="http://10.0.2.5:3128"
export https_proxy="http://10.0.2.5:3128"
# no_proxyにはGPUクラスターに使うIPアドレスを記載
# この例でいうと、10.0.2.10以降を自分の環境に合わせて変更
export no_proxy="localhost,cluster.local,127.0.0.1,::1,10.0.2.10,10.0.2.20,10.0.2.30"

その後、scripts/setup.shを実行。

# Install software prerequisites and copy default configuration
./scripts/setup.sh

3. Ansible inventory 設定

GPUクラスターの設定にはAnsibleが使われるため、それの設定を行います。

config/inventoryを編集。

######
# ALL NODES
# NOTE: Use existing hostnames here, DeepOps will configure server hostnames to match these values
######
[all]
# ノード名 ansible_host=IPアドレス として記載
mgmt01     ansible_host=10.0.0.1  # masterノードのIPアドレス
#mgmt02     ansible_host=10.0.0.2  # masterを複数台用意する場合に使用
#mgmt03     ansible_host=10.0.0.3  # masterを複数台用意する場合に使用
#login01    ansible_host=10.0.1.1  # loginノードは使用しない
gpu01      ansible_host=10.0.2.1  # workerノードのIPアドレス(1台目)
#gpu02      ansible_host=10.0.2.2  # workerノードのIPアドレス(2台目あれば使用)

######
# KUBERNETES
######
[kube-master]
mgmt01  # コメントアウトを外す
#mgmt02
#mgmt03

# Odd number of nodes required
[etcd]
mgmt01  # コメントアウトを外す
#mgmt02
#mgmt03

# Also add mgmt/master nodes here if they will run non-control plane jobs
[kube-node]
gpu01  # コメントアウトを外す
#gpu02


######
# SSH connection configuration
######
[all:vars]
# SSH User
ansible_user=ubuntu  # master, workerで作成しているユーザー名を記載
ansible_ssh_private_key_file='~/.ssh/id_rsa'
# SSH bastion/jumpbox
#ansible_ssh_common_args='-o ProxyCommand="ssh -W %h:%p -q ubuntu@10.0.0.1"'

続いて、proxyの設定。こちらは前項で設定した値と同じようにする。

config/group_vars/all.yamlを編集

################################################################################
# PROXY
################################################################################
# コメントアウトを外す
# proxyおよびno_proxyを設定
# Proxy Variables needed for scripts, ansible, etc.
http_proxy: http://10.0.2.5:3128
https_proxy: http://10.0.2.5:3128
no_proxy: localhost,cluster.local,127.0.0.1,::1,10.0.2.10,10.0.2.20,10.0.2.30

# コメントアウトを外す
proxy_env:
      http_proxy: '{{ http_proxy }}'
      https_proxy: '{{ https_proxy }}'
      no_proxy: '{{ no_proxy }}'

4. Ansible設定の確認

これらの設定が上手くできているかを確認します。

# -u <ユーザー名> を記載
# 実行後パスワードを聞かれるので入力
ansible all -m raw -a "hostname" -k -K -u ubuntu

問題なければALL OK 的な表示がでているはずです。

5. kubernetesのインストール

# NOTE: If SSH requires a password, add: `-k`
# NOTE: If sudo on remote machine requires a password, add: `-K`
# NOTE: If SSH user is different than current user, add: `-u ubuntu`
# -k -K -u <ユーザー名> オプションをつけることで各ノードにユーザー/パスワードでsshログインする
# 下記コマンドを実行後パスワードを聞かれるのでパスワードを入力
ansible-playbook -l k8s-cluster playbooks/k8s-cluster.yml -k -K -u ubuntu

6. kubernetes構築の確認

まずはkubernetesが立ち上がっているかを確認

# You may need to manually run: `sudo cp ./config/artifacts/kubectl /usr/local/bin`
kubectl get nodes

# こんな感じの結果が返ってくればOK
NAME     STATUS   ROLES    AGE   VERSION
gpu01    Ready    <none>   1d   v1.17.6
mgmt01   Ready    master   1d   v1.17.6

次に、GPUが認識されるか確認

export CLUSTER_VERIFY_EXPECTED_PODS=1 # GPUクラスター全体で搭載しているGPUの枚数
./scripts/k8s_verify_gpu.sh 

GPUが正しく認識されていればdeepopsを使ったGPUクラスターの構築は完了です!!

まとめ

deepopsを使うことで簡単にkubernetesを使ったGPUクラスターが構築できましたね。

次回はこのGPUクラスターを使った学習の実行についてまとめていこうと思います。