Jenkins入門
流石にCIツールを使ったことがないのは,恥ずかしいなと思って,今更ながらJenkinsを触ってみました.
僕はDockerが好きなので,Dockerを使って環境構築をしました.
基本的にこのサイトを参考にしました.
Jenkinsにブラウザからアクセスするときは,Macの人は以下のURLでアクセスできます.
あとは手順通りに進めれば,環境構築が完了しました(Jenkinsのsetupって結構時間かかりますね).
最終的なフォルダ構造はこんな感じになりました.
. ├── README.md ├── docker │ ├── Dockerfile │ ├── Makefile │ └── plugins.txt └── run.sh
低レイアの勉強(Chisel, RISC-V, ISA)
最近,僕が読んでるブログで,ChiselやRISC-Vなどの単語が結構出てきて, ナンジャラホイって感じなので勉強してみました.
Chiselってなに?
Scala言語のライブラリです. Scalaを使って,VerilogやVHDLを生成できます.
僕はScalaはやったことがないので,解説のリンクを貼っておきます.
一年ほどFPGAをガッツリ勉強していましたから, Verilogは使ったことがあります.
Pythonが好きなので,そっちでも似たようなライブラリがあった気がします. やっぱりみんなVerilogとか嫌いなんですね. (そういえば,家に使ってないPYNQがあるのを思い出した)
僕はVerilog書くのはあんまり嫌いじゃないですね(ただ慣れただけかも).
RISC-Vってなに?
こっちの方が最近はよく聞く気がします.
オープンな命令セットアーキテクチャ(ISA)です. 公式サイトを見ても,大企業が名を連ねていて強そうですね(小並).
僕自身の理解が甘いので,詳細は書きませんが, 要するにオープンなISAってあんまりないから,話題になっているらしいですね.
ちなみに,ChiselもRISC-VもUCBerkeleyがサポートしていて,流石!って感じですね.
命令セットアーキテクチャってなに?
ここまで来ると,僕の理解度では「命令セットアーキテクチャ」ってなんだっけ?ってなります.
っというわけで調べてみました.
東京大学の坂井先生の資料がわかりやすかったです.
https://www.mtl.t.u-tokyo.ac.jp/~sakai/hard/hard3.pdf
命令セットってのは,CPUが使用できる命令の集合(算術論理演算命令,データ移動命令,分岐命令など)です. 特定のCPUと同じ命令セットを持つと,互換プロセッサと呼ばれます.
っで,命令セットアーキテクチャっていうのは,命令の表現形式とその命令の動作を定めたものです. 表現形式ってのは,通信規格みたいなものなで,どのビットが何に対応するのかみたいなものです.
RISC vs CISC
ここで僕が昔インターンに行った頃に,少し習ったRISCとCISCの違いを書いておきます.
RISC ... Reduced Instruction Set Computer
CISC ... Complex Instruction Set Computer
簡単に言うと,CISCはいろんな命令をゴリゴリに積めば便利でしょって感じで作られたプロセッサです.
でも実際に利用するのは,簡単な命令がほとんどでコンパイラが出力するのが難しくなります.
そこで命令数が少なく,動作が単純なRISCに移行されました.
まとめ
Mujocoのライセンスで苦しまないためのメモ
さて,この前openai/gymを再インストールしようとしたら,
「mujoco-py
を入れろ」言われて,やむなくmujoco導入を検討しました.
ライセンス獲得方法
幸い僕は学生なので,学生ライセンスを獲得することができました.
https://www.roboti.us/license.html
取得したAccount Numberから,Computer idを登録して,ライセンスキーをもらいます.
この入力場所がわかりにくいので,ライセンスページに飛んだら「Ctrl + F」で「Computer id」の単語で見つけた方が楽です.
各ライセンスできること
学生ライセンスや個人ライセンスには,PCの台数制限があります.
これにはパソコンのハードウェアアドレスが使用されています.
ここで重要なことがわかります.
つまり,
DockerでMujocoが動かせない!
もしDockerで使いたいなら,Institutionalライセンスを使えとのことです.
僕のように数時間も苦しまないように注意してください.
Mac DockerでGUIを使いたい(XQuartz版)
Dockerを使って,GUIのアプリケーションを利用する際には,いくつか方法があります.
VNCを使うと,どの端末からでもブラウザ経由で,GUIを操作することができますが,
今回はXQuartzでやってみたいと思います.
XQuartzを使用して,コンテナ内でDISPLAY変数を設定できるようにします.
これによって,ホスト側にGUI画面を表示させることができます.
Dockerはインストール済み前提で,話を進めます.
XQuartzインストール
homebrewを使って,サクッとインストールしていきます.
$ brew cask install xquartz
XQuartzの設定
早速,XQuartzを実行してみます.
$ open -a XQuartz
これでXQuartzというGUIアプリが,ホスト側Macに表示されます.
僕は英語版を利用しているので,Preference > Security
から,
「Allow connections from network clients」にチェックを入れます.
日本語だと,設定 > セキュリティ
,「ネットワーククライアントからの全ての接続を許可」とかかな.
ホスト側のIPアドレス
XQuartzが起動したら,ターミナルでxhost
コマンドを使って,ホスト側のIPアドレスを登録します.
$ IP=$(ifconfig en0 | grep inet | awk '$1=="inet" {print $2}') $ echo $IP 192.168.XXX.XXX $ xhost + $IP 192.168.XXX.XXX being added to access control list
もし,xhostコマンドが見つからなくても,焦らずに以下のように実行しましょう.
ただパスが通ってないだけです.
$ /usr/X11/bin/xhost + $IP
DockerからFirefoxを起動
早速,DockerでGUIを利用してみます.
コマンドは簡単です.
$ docker run -d --name firefox -e DISPLAY=$IP:0 -v /tmp/.X11-unix:/tmp/.X11-unix jess/firefox
無事起動しましたか?
次回はROSでも起動させてみましょう!
VS Codeで関連付けするファイル種類を設定する
Docker使いますか?
僕もよくDockerを使うのですが,
Dockerfileの名前で,Dockerfile.hoge
みたいにして,
複数種類のDockerfileを作ることがあるかと思います.
そんなファイルをvscodeで開くと, Dockerfileに関連付けされないので, いちいち手作業で「これはDockerfileなんだよ〜」って教えてあげる必要があります.
そこでvscodeに自動で関連付けして,見やすい色で表示してもらうために,
以下のように設定をsetting.json
に追記するのがおすすめです.
{ // 別の設定項目 "files.associations": { "Dockerfile.*": "dockerfile" } }
tf-debuggerのことはじめ
Deep Learningを動かしていると,時々nan
やinf
などの計算不能な値が生まれてしまう.
そんなときに,便利なのがtf-debuggerだよって聞いて使ってみたいと思った.
前提として,名前の通り,tensorflowで動作します.
個人的に便利だと思ったのは説明にあったこれですね.
TensorFlow の ML モデルの開発中によく起きる問題は、オーバーフローやゼロによる除算、ゼロの対数などによって不適切な数値(無限大や NaN)が発生することです。巨大な TensorFlow グラフでは、そのようなノードの発生元を見つけるのは非効率で時間もかかります。tfdbg CLI と条件付きブレークポイントを使うと、すばやく問題のノードを特定できます。
やっぱり,みんな詰まるポイントは同じなんですね.
とりあえず,以下の動作テスト用のプログラムを用意します.
デバッガーの導入は,既存のsess
を,tf_debug.LocalCLIDebugWrapperSession
でラッピングするだけですね.
import numpy as np import tensorflow as tf from tensorflow.python import debug as tf_debug xs = np.linspace(-0.5, 0.49, 100) x = tf.placeholder(tf.float32, shape=[None], name="x") y = tf.placeholder(tf.float32, shape=[None], name="y") k = tf.Variable([0.0], name="k") y_hat = tf.multiply(k, x, name="y_hat") sse = tf.reduce_sum((y - y_hat) * (y - y_hat), name="sse") train_op = tf.train.GradientDescentOptimizer(learning_rate=0.02).minimize(sse) sess = tf.Session() sess.run(tf.global_variables_initializer()) sess = tf_debug.LocalCLIDebugWrapperSession(sess) for _ in range(10): sess.run(train_op, feed_dict={x: xs, y: 42 * xs})
実行し,sess.run()
メソッドが呼び出されると,
tfdbg
のコマンドラインインターフェースが起動し,
こんな画面が現れます.
使い方は,この動画を見ればだいたいわかります.
上のタブをクリックできるのが,便利ですね.
とりあえず,runさせてみましょう.
tfdbg> run
矢印の部分をクリックすると,こんな画面に切り替わって,
learning_rate
の状態を確認することが出来ます.
上のタブでそれぞれの情報も確認できるので,便利ですね.
これから,積極的に使っていこうと思います.
デバッガーのCLI内のスクロールは,PgUp
とPgDw
を使うけど,もっと便利なキーバインドはないのかなぁ...