合理主義的グルメブログ

学生起業家の日常をツラツラと書いています。主に食事情報です。

【Python】argparseで,選択肢を与える方法

python使っている人なら,コマンドライン引数の取得に,argparseを使うと思います.

僕も使っているので,その際に,
このオプションは,一定の選択肢の中から選んでほしいときに使えるオプションがあるので紹介します.

choices

--choicesオプションにより,引数には許される値を指定することができます.

import argparse

parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument('--mode', help='set mode, [real] or [sim]', type=str, choices=['real', 'sim'])
args = parser.parse_args()

このようにすると,--modeオプションは,realsimをしていなければいけなくなります.

御影瑛路『空ろの箱と零のマリア』を読んだ

この前に読んだ,「Fランクの暴君」が面白かったので,
同じ作者の作品で評判が良かった「空ろの箱と零のマリア」を読んでみました.

いわゆるループものなので,
最初から最後までずっと同じ状況を繰り返しています.

最初は読んでて退屈すると思っていましたが,
話が非常に凝っていて,全然ダレずに読み終える事ができました.

主人公の主な目標は,ループを引き起こしている犯人を見つけることですが,
細かい違和感などが,文章内に上手く織り込まれていており,
精読しているのに全然わからなかったです.

話全体は,おすすめですが, 個人的にはドンピシャなジャンルじゃないので,続きは読まないと思います.

このようなジャンルが好きな人は絶対にハマると思います.

docker: Error response from daemon: create nvidia_driver_410.73: VolumeDriver.Create: internal error, check logs for details.

nvidia-dockerをインストールして実行してみたら,
こんなエラーが出た.

$ nvidia-docker run --rm nvidia/cuda nvidia-smi
docker: Error response from daemon: create nvidia_driver_410.73: VolumeDriver.Create: internal error, check logs for details.
See 'docker run --help'.

対処法を探して,解決したのでメモします.

ソースはここです.

github.com

まずは,nvidia-dockerの状態を書き換えます.

$ systemctl edit nvidia-docker

これで,下記を追記します.

[Service]
ExecStart=
ExecStart=/usr/bin/nvidia-docker-plugin -s $SOCK_DIR -d /usr/local/nvidia-docker-test

っで,ザザッと設定を行うことで,動くようになりました.

$ sudo mkdir /usr/local/nvidia-docker-test
$ sudo chown nvidia-docker /usr/local/nvidia-docker-test
$ sudo systemctl restart docker nvidia-docker

動作確認するとこんな感じです.

$ nvidia-docker run --rm nvidia/cuda nvidia-smi
Tue Oct 30 03:46:20 2018
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 410.73       Driver Version: 410.73       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  Tesla V100-SXM2...  Off  | 00000000:04:00.0 Off |                    0 |
| N/A   35C    P0    51W / 300W |    417MiB / 16130MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
+-----------------------------------------------------------------------------+

【Pybullet】接触を検知する

pybulletを使っていて,ロボットが何かと接触したことを検知したかったです.

ロボットの足が地面と接地しているかは,よく強化学習における観測データとして利用されます.

命令としては,p.getContactPoints()を使えば出来ます.

docs.google.com

こんな感じで使います.
robotは対象のbodyのid番号で,right_footが対象linkのidです.

result = p.getContactPoints(robot, -1, right_foot, -1)

この場合,robotright_foot接触している座標を返します.

値があるとこんな感じです.

print(result)
-> ((0, 1, 0, 5, -1, (0.306818108432366, -0.20726071519498707, -2.237793284010081e-16), (0.30681810843236623, -0.20726071519498718, 0.0004359660735957366), (-5.697036571337818e-13, 2.3927553599618834e-13, -1.0), 0.00043596607359596036, 14.825712481037616),)

何とも接触していなければ,空のタプルを返します.

print(result)
-> ()

NVIDIA Driverをアップデートして,nvidia-docker 2.0に以降する

古いGPUドライバーを使っていると,
時々わけわからん警告が発生します.

僕は以下のリンクのWarningに当たりました.

https://devtalk.nvidia.com/default/topic/1027077/container-pytorch/-quot-unexpected-end-of-proc-mounts-line-overlay-quot-on-p3-8xlarge/

解決策として,「バージョン396以降にしろよ」っと言っています.

っということで,ドライバーをアップデートしたのでメモしておきます.

対応バージョンを確認

以下のサイトから,自分のGPUに対応したドライバーのバージョンを確認します.

Download Drivers | NVIDIA

既存ドライバー確認

すでにドライバーがインストールされているか確認します.

$ dpkg -l | grep nvidia

僕自身,詳しくないので,勉強しながら行きます.
dpkgとはDebianのパッケージである.debファイルを扱うコマンドです.
これが先日買収されたRedhat系だとrpmコマンドになります.

-lオプションは,パッケージを一覧表示します.
今回は後ろに何も指定していないので,インストールされているパッケージが一覧表示されます.

その後,パイプ(|)でつないで,grepコマンドで,「nvidia」を含むパッケージだけを取り出しています.

古いドライバーの削除

もし,既存ドライバーが存在していた場合は,そいつを削除します.

$ sudo apt-get purge nvidia-*

なぜか僕の環境だと,正規表現が使えなかったので,こんな感じで全部手打ちしました.

$ sudo apt-get purge  -y nvidia-384 nvidia-390 nvidia-410 nvidia-docker nvidia-opencl-icd-384 nvidia-opencl-icd-390 nvidia-opencl-icd-410 nvidia-prime nvidia-setting

リポジトリの登録

Ubuntuのドライバーを提供しているリポジトリを登録します.

$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt-get update

ドライバーのインストール

事前に調べたバージョンを指定してインストールします.

$ sudo apt-get install -y nvidia-<最新バージョン>

再起動

$ sudo reboot

確認

nvidia-smiを使って,GPUが見えているか確認します.

$ nvidia-smi

nvidia-dockerのインストール

僕は機械学習用にGPUを利用しているので, CUDAはホスト環境には入れないで, すべて仮想環境で管理しています.

そのために,nvidia-dockerをインストール)します.
(dockerのインストールは,ここ

nvidia-docker 1.0 を削除

前に,nvidia-docker 1.0を使っていたので,最初にそいつを削除します.

$ docker volume ls -q -f driver=nvidia-docker | xargs -r -I{} -n1 docker ps -q -a -f volume={} | xargs -r docker rm -f
$ sudo apt-get purge nvidia-docker

リポジトリの登録

$ curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
$ curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list |  sudo tee /etc/apt/sources.list.d/nvidia-docker.list
$ sudo apt-get update

nvidia-docker 2.0 をインストール

$ sudo apt-get install -y nvidia-docker2
$ sudo pkill -SIGHUP dockerd

pkillコマンドは,プロセス名を指定して,シグナルを送信するコマンドです.
詳しくは以下のリンクを参照くだいさい.

www.atmarkit.co.jp

【Python】locals()とglobals()

gym baselinesのPPOのプログラムを読んでいたら,
よく知らない関数が出てきたのでメモする.

引っかかったのは,callback部分で,locals()globals()ってやつです.

locals()は,自身のローカル領域の変数群の値を辞書型で返してくれる.

globals()は,グローバル変数群の値を辞書型で返してくれる.

LinuxでCPUコア数を確認する

マルチスレッド化するときに, PCの最大スペックまで出したいので,CPUコア数を知りたかった.

今回はUbuntu環境で動作を確認しました.

物理CPU の個数

まずはCPUの物理的な個数を確認します.

$ grep physical.id /proc/cpuinfo | sort -u | wc -l
2

僕の場合は2つですが,多分,普通は1個だと思います.

CPUごとのコア数

次に各CPUが何コア持っているかを確認します.

$ grep cpu.cores /proc/cpuinfo | sort -u
cpu cores       : 20

僕の環境は,intel xeonを使っているので,こんなものです.

論理プロセッサーの数

コンピュータから見たときに,存在するように見えるCPUのコア数です.
ハイパースレッド処理が有効になっている場合,
物理的なCPUのコア数よりも,多く表示される場合があります.

$ grep processor /proc/cpuinfo | wc -l
40

僕の環境では,物理的なコア数(2 * 20=40)と同じ数になりました.