机器学习工程师尝试入门Ansible
为了让深度学习的开发环境更加轻松地构建和破坏,我尝试使用Ansible自动化环境设置。
本文的目的是告诉应用程序和机器学习工程师,Infrastructure as Code(IaC)比我想象的要简单得多。对于那些已经在使用Ansible的人来说,这可能是一个简陋的内容,请您谅解。
“总结一下”
-
- ホスト名の設定
-
- aptサーバーを日本サーバーに変更
-
- aptコマンドでインストール
-
- nvidia-driverのインストール
-
- docker-ce + nvidia-docker2のインストール
- dockerサービスの再起動
使用以下命令对其进行自动化。
# Ansibleのインストール。最新のインストール手順は公式ページを参照すること
# cf. https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html
sudo apt update
sudo apt install software-properties-common
sudo apt-add-repository --yes --update ppa:ansible/ansible
sudo apt install ansible
# Playbookの取得
# e.g.
curl -L https://raw.githubusercontent.com/chmod644/deeplearning-setup-playbook/d7db096cbd42741f68f2461c01280f138eee3c5a/playbook.yml -o playbook.yml
# ansible-playbookを実行
ansible-playbook playbook.yml -u ansible -i localhost, -c local --ask-become-pass
我的感受
在实际使用中的感觉是学习成本比我想象的要低得多。在没有使用过Ansible或其他IaC工具的情况下,我在一天内就能完成环境自动化部署的工作。
这次只是自动化了一台机器的环境搭建,虽然对于配置管理来说仍然非常基础,但我真的觉得非常简单,令人惊讶。
因为Ansible的优点已经在很多文章中进行了解释,所以现在再详细描述一遍可能有些多余,但我还是想重新感受一下,并且做一些记录。
-
- モジュールが豊富で、基本的な作業(apt, yum, wget, systemctlなどなど)はたいてい簡単に記述できる
-
- 構成情報を記述するplaybookはyaml形式なので、記述方法を覚える学習コストが低いもしくはゼロ
-
- QiitaやStack Overflow, GitHub issueにも情報が多いので調べやすい
- Ansibleで管理される側のノードには基本的にpythonだけあればよいので事前準備が楽(エージェントレス)
目标
目標是將以下工作自動化,對開發機器進行操作。
-
- ホスト名の設定
-
- aptサーバーを日本サーバーに変更
-
- aptコマンドでインストール
-
- nvidia-driverのインストール
-
- docker-ce + nvidia-docker2のインストール
- dockerサービスの再起動
只有在内部社区环境中使用时,才需要进行诸如DNS设置和域参与等初始设置,但由于此次是在家中的计算机上进行验证,因此这些方面不包括在自动化的范围内。
另外,我們只使用了一台開發機進行環境配置。這意味著控制節點(Ansible執行節點)和被管理節點(由Ansible管理的節點)都在同一台開發機上。
步骤
用户执行的步骤如下。
-
- 在本地主机上安装ansible
-
- 从内部服务器下载playbook.yml文件
- 指定本地主机并执行ansible命令
开发机器的规格:
-
- Ubuntu 18.04
-
- GeForce GTX 1060
- (Ansible 2.8 ※本手順でインストールする)
1. 安装Ansible本体
按照Ansible的安装步骤进行安装。
2. 下载Playbook
开发机上甚至没有安装Git的设想。因此,我认为最好将playbook整合到一个文件中,可以通过curl或wget来获取。
curl -L https://raw.githubusercontent.com/chmod644/deeplearning-setup-playbook/d7db096cbd42741f68f2461c01280f138eee3c5a/playbook.yml -o playbook.yml
playbook的内容将在后面进行描述。
3. 指定本地主机并执行
ansible-playbook playbook.yml -i localhost, -c local --ask-become-pass
关于命令行参数
-i localhost, : Managed Nodeとしてlocalhostを指定している。カンマは必須なので注意。IPアドレスでもよい
-c local : ssh接続せずlocalhostで、カレントユーザーまま実行する。-u <ユーザー名> や remote_user で指定されたユーザーは無視される。(Ansible標準動作ではssh接続するが、Connection Pluginsという機能でssh以外の接続もできる)
–ask-become-pass : sudo権限で実行するためのパスワードを対話的に入力する。上記のように -c local が指定された場合は、カレントユーザーのパスワードを指定すればよい。
Playbook的内容
Playbook已经在GitHub上提供了。
虽然这篇写得很拙劣令人难堪,不过希望能得到反馈,所以我就公开晒出来了。如果你有更好的写作方式或者发现了错误,请给我留言。
- hosts: localhost
# sudo権限でtasksを実行する。
become: yes
vars:
# ディストリビューションの番号を 18.04 -> 1804 に置換
ubuntu_dist_for_nvidia_cuda: "{{ ansible_distribution_version | regex_replace('\\.', '')}}"
tasks:
# --- ここからホスト名の設定 ---
# ホスト名を標準入力から待ち受けている。
- name: prompt hostname
pause:
prompt: "HOSTNAME [{{ ansible_fqdn }}]"
register: hostname_input
# ホスト名が入力されたらその値を、入力されなかったら
# 初期ホスト名(ansible_fqdn)を変数hostnameにセットする
- name: set default hostname
set_fact:
hostname: "{{ hostname_input.user_input | default(ansible_fqdn, true) }}"
# 初期ホスト名とhostnameの内容が違う場合はホスト名を設定し直す。
- name: set hostname
hostname:
name: "{{ hostname }}"
when: hostname != ansible_fqdn
# --- ここまでホスト名の設定 ---
# aptリポジトリを日本サーバーに変更する。
- name: set japanese apt server
replace:
path: /etc/apt/sources.list
regexp: '(http:\/\/archive\.ubuntu\.com\/ubuntu\/|http:\/\/us\.archive\.ubuntu\.com\/ubuntu\/)'
replace: 'http://jp.archive.ubuntu.com/ubuntu/'
# 使いそうなパッケージを入れてる。
- name: install apt packages
apt:
name: [git]
state: present
update_cache: yes
# --- ここからNVidiaドライバのインストール ---
- name: add nvidia-driver registory key
apt_key:
url: http://developer.download.nvidia.com/compute/cuda/repos/{{ ansible_distribution | lower }}{{ ubuntu_dist_for_nvidia_cuda }}/{{ ansible_architecture }}/7fa2af80.pub
state: present
- name: add nvidia-driver repository source
apt_repository:
repo: deb https://developer.download.nvidia.com/compute/cuda/repos/{{ ansible_distribution | lower }}{{ ubuntu_dist_for_nvidia_cuda }}/{{ ansible_architecture }} /
state: present
update_cache: no
filename: nvidia-cuda
- name: install nvidia-driver
apt:
name: [nvidia-418]
state: present
update_cache: yes
# --- ここまでNVidiaドライバのインストール ---
# --- ここからDocker+NVidia-Dockerのインストール ---
# Dockerの依存パッケージをインストール
- name: install docker dependencies
apt:
name: [apt-transport-https, ca-certificates, curl, gnupg-agent, software-properties-common]
state: present
update_cache: yes
# Dockerのaptレジストリの認証キーを取得
- name: add docker registory key
apt_key:
url: https://download.docker.com/linux/debian/gpg
state: present
# Dockerのaptレジストリを追加。/etc/apt/source.list.d/<filename>.listに追加される。
- name: add docker repository source
apt_repository:
repo: deb [arch=amd64] https://download.docker.com/linux/ubuntu {{ ansible_distribution_release }} stable
state: present
update_cache: no
filename: docker
# nvidia-dockerも同じように認証キーとレジストリを追加する
- name: add nvidia-docker repository key
apt_key:
url: https://nvidia.github.io/nvidia-docker/gpgkey
state: present
# { ansible_distribution | lower }}{{ ansible_distribution_version }} は ubuntu18.04とパースされる。
- name: add nvidia-docker repository source
get_url:
url: https://nvidia.github.io/nvidia-docker/{{ ansible_distribution | lower }}{{ ansible_distribution_version }}/nvidia-docker.list
dest: /etc/apt/sources.list.d/nvidia-docker.list
owner: root
group: root
mode: 0644
- name: install docker and nvidia-docker
apt:
name: ['docker-ce=5:18.09.6~3*', 'nvidia-docker2=2.0.3+docker18.09.6-3', docker-ce-cli, containerd.io]
state: present
update_cache: yes
register: nvidia_docker_apt
# Docker+NVidia-Dockerのバージョンを固定する
- name: keep versions of docker and nvidia-docker
dpkg_selections:
name: "{{ item }}"
selection: hold
with_items: [docker-ce, nvidia-docker2]
# --- ここまでDocker+NVidia-Dockerのインストール ---
# DockerとNVidia-Dockerのインストールで変更があればdockerサービスを再起動する
- name: reload docker configuration
service:
name: docker
state: reloaded
when: nvidia_docker_apt.changed == True
# カレントユーザーをdockerグループに追加
- name: add user to docker group
user:
name: '{{ ansible_user }}'
groups: docker
append: yes
确认动作
尝试在Docker容器中运行nvidia-smi。
$ docker run --runtime=nvidia --rm nvidia/cuda:9.0-base nvidia-smi
Tue Jun 18 18:30:59 2019
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 410.78 Driver Version: 410.78 CUDA Version: 10.0 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 GeForce GTX 106... Off | 00000000:01:00.0 Off | N/A |
| 28% 40C P8 6W / 120W | 0MiB / 6078MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| No running processes found |
+-----------------------------------------------------------------------------+
迷上了
-
- Connection pluginに local を指定するとremote_userの設定が無視されること。しばらく気づかなかった。
-
- replaceの正規表現の仕様はPythonのreライブラリと同じらしい。
-
- たまにaptモジュールのところで Failed to update apt cache … というエラーメッセージで落ちる。この現象は ansible-playbook の前に sudo apt-get clean を実行することで解消可能。apt-get clean相当のこともAnsibleで実行できるようにと要望が出されているがまだ実装されてない様子。
-
- Ansibleに直接関係ないが、nvidia-docker2のバージョンとdocker-ceのバージョンは揃える必要があるため、明確にバージョン指定してやらないといけない。
- パッケージの固定は dpkg_selectionsモジュールで行う。aptと違ってnameにリストが指定できないので注意。
待办事项
Ansibleに詳しい人にレビューしてもらう
CUDA/cuDNNのインストールを自動化 ※cuDNNのダウンロードにWeb画面上でのサインインが必要なため保留
社内環境でのドメイン参加・共通セットアップの自動化
パッケージのバージョンを変数化する
Best Practices — Ansible Documentation に則ってリファクタする
Ansibleの挙動確認
対話的なコマンドの実行 (expect – Executes a command and responds to prompts — Ansible Documentationが使えるらしい)
Control NodeからManaged Nodesへのファイルコピー
请提供一个需要翻译的具体句子。
-
- Installation Guide — Ansible Documentation
-
- [Ansible] AnsibleのPlaybookをlocalhostに対して実行する – Qiita
-
- Ansible Playbook to install nvidia-docker2
-
- Ansibleをはじめる人に。 – Qiita
-
- Ansible 入門 – Qiita
-
- Get Docker CE for Ubuntu | Docker Documentation
-
- NVIDIA/nvidia-docker: Build and run Docker containers leveraging NVIDIA GPUs
-
- Ansibleでパスワードをスマートに – Qiita
-
- apt-getの利用リポジトリを日本サーバーに変更する – Qiita
-
- ansible で prompt (入力待ち) の実現とその周辺テクニックのまとめ – Qiita
-
- NVIDIA/ansible-role-nvidia-docker
- Support apt-mark hold · Issue #18889 · ansible/ansible