合理主義的グルメブログ

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

Jenkins入門

流石にCIツールを使ったことがないのは,恥ずかしいなと思って,今更ながらJenkinsを触ってみました.

僕はDockerが好きなので,Dockerを使って環境構築をしました.

基本的にこのサイトを参考にしました.

dev.classmethod.jp

Jenkinsにブラウザからアクセスするときは,Macの人は以下のURLでアクセスできます.

http://127.0.0.1:8080

あとは手順通りに進めれば,環境構築が完了しました(Jenkinsのsetupって結構時間かかりますね).

最終的なフォルダ構造はこんな感じになりました.

.
├── README.md
├── docker
│   ├── Dockerfile
│   ├── Makefile
│   └── plugins.txt
└── run.sh

GitHubリポジトリ作っておきました.
明日はもっと踏み込んでやっていこうと思います.

github.com

「ブルーピリオド」を読んだ

とある教授にオススメされた「ブルーピリオド」という漫画を読んでみた.

1巻と2巻を読みましたが,結構面白かったです.

優秀だけど夢を持てなかった高校生が東京藝術大学を目指す物語です.
夢を目指す大切さと厳しさ,その葛藤などが細かに描かれていて,本当に面白い漫画でした.

僕自身,上京してから,美大出身の人とたまに話しましたが,
この漫画を読んでから彼らの凄さがよくわかりました.

メッセージ性が強い作品なので,芸術などに興味がない人も楽しめると思います. 僕も芸術にはあんまり興味がなかったですが,本当に面白かったです. また,芸術の見方もほんの少しだけわかりました.

低レイアの勉強(Chisel, RISC-V, ISA)

最近,僕が読んでるブログで,ChiselやRISC-Vなどの単語が結構出てきて, ナンジャラホイって感じなので勉強してみました.

Chiselってなに?

Scala言語のライブラリです. Scalaを使って,VerilogVHDLを生成できます.

僕はScalaはやったことがないので,解説のリンクを貼っておきます.

techacademy.jp

一年ほどFPGAをガッツリ勉強していましたから, Verilogは使ったことがあります.

Pythonが好きなので,そっちでも似たようなライブラリがあった気がします. やっぱりみんなVerilogとか嫌いなんですね. (そういえば,家に使ってないPYNQがあるのを思い出した)

僕はVerilog書くのはあんまり嫌いじゃないですね(ただ慣れただけかも).

RISC-Vってなに?

こっちの方が最近はよく聞く気がします.

オープンな命令セットアーキテクチャ(ISA)です. 公式サイトを見ても,大企業が名を連ねていて強そうですね(小並).

riscv.org

僕自身の理解が甘いので,詳細は書きませんが, 要するにオープンなISAってあんまりないから,話題になっているらしいですね.

ちなみに,ChiselもRISC-VもUCBerkeleyがサポートしていて,流石!って感じですね.

命令セットアーキテクチャってなに?

ここまで来ると,僕の理解度では「命令セットアーキテクチャ」ってなんだっけ?ってなります.
っというわけで調べてみました.

東京大学の坂井先生の資料がわかりやすかったです.

https://www.mtl.t.u-tokyo.ac.jp/~sakai/hard/hard3.pdf

命令セットってのは,CPUが使用できる命令の集合(算術論理演算命令,データ移動命令,分岐命令など)です. 特定のCPUと同じ命令セットを持つと,互換プロセッサと呼ばれます.

っで,命令セットアーキテクチャっていうのは,命令の表現形式その命令の動作を定めたものです. 表現形式ってのは,通信規格みたいなものなで,どのビットが何に対応するのかみたいなものです.

RISC vs CISC

ここで僕が昔インターンに行った頃に,少し習ったRISCCISCの違いを書いておきます.

RISC ... Reduced Instruction Set Computer
CISC ... Complex Instruction Set Computer

簡単に言うと,CISCはいろんな命令をゴリゴリに積めば便利でしょって感じで作られたプロセッサです.
でも実際に利用するのは,簡単な命令がほとんどでコンパイラが出力するのが難しくなります.
そこで命令数が少なく,動作が単純なRISCに移行されました.

まとめ

命令セットアーキテクチャの最近の流行りはRISC-Vだよ

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ライセンスを使えとのことです.

www.mujoco.org

僕のように数時間も苦しまないように注意してください.

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を動かしていると,時々naninfなどの計算不能な値が生まれてしまう.
そんなときに,便利なのが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コマンドラインインターフェースが起動し,
こんな画面が現れます.

f:id:GoKIDS:20181104082550p:plain

使い方は,この動画を見ればだいたいわかります.

youtu.be

上のタブをクリックできるのが,便利ですね.

とりあえず,runさせてみましょう.

tfdbg> run

f:id:GoKIDS:20181104084406p:plain

矢印の部分をクリックすると,こんな画面に切り替わって, learning_rateの状態を確認することが出来ます. f:id:GoKIDS:20181104084531p:plain

上のタブでそれぞれの情報も確認できるので,便利ですね.

これから,積極的に使っていこうと思います.

デバッガーのCLI内のスクロールは,PgUpPgDwを使うけど,もっと便利なキーバインドはないのかなぁ...

参考リンク