ToDo:
https://twitter.com/taku910/status/1010082944629727234 などを見てもそうだけど、この用語法が良いかどうかは議論の余地があると思う。
define-by-run が研究時に有利なアプローチなのは間違いないという合意は形成されつつあるようにあると思う。プロダクショナイズ時の整合性の保証と、トレーニング速度の心配が define-by-run で気になることかと思う
define-and-run はデプロイ時に Python のランタイムが必須でなくなり、また、トレーニング時に使ったモデルが正しく使われている保証が取りやすい。ただし
原始的な define-by-run はホスト言語に処理が戻ってくるので、速度が出しにくい。ただ、最適化の余地があって
そもそも、速度が出ないのなら、 Python をコンパイルしちゃえばいいという発想もありえる。これは単に Python を C なりアセンブリに変換するという話ではなくて、 Python 内で記述されたハイレベルなオペレーション群をくっつけていって、アクセラレータ内で完結した実行をしてもらう、という話
「Python をコンパイルする」て語感と実体がだいぶ違うアプローチで、感覚としては CUDA に近いものだと説明している。 CUDA だと、 __global__ てついてる関数はデバイスで実行して、ホスト側に main があってそのデバイスの関数を呼んだりする。同じような感じで、 Python の一部の matmul+activation みたいなところを Python じゃないコードでまとめて実行すれば良い
実際やってるのが Pytorch の @script や、そもそも言語まで変えてしまったのが Swift for TensorFlow 。アクセラレータに投げる部分の抽出と、計算グラフの微分をしたいので、 AST なりなんなり、言語処理系にまあまあ手を入れる必要があると思う。
このへんのアプローチは、気持ちとしては define-by-run のまんまだけど、なんか明らかに事前コンパイルしてる以上、 define-and-run の方が適切な呼び名な気がしてしまうので…… Swift for TensorFlow などは model-as-code と言ってるのだと思う
個人的には model-as-code が正しい方向性に思える
話がそれていく。 Swift for TensorFlow みたいな方向性が正しいとして、欲しい/必要と思う機能として
あたりを考えてると、 mypy と tangent で(どちらもよく知らないが)、一応 Python をコンパイルして使う、てのは要件を満たしそうな気もする
もっとそれていくけど、なんか雑談してると、 XX が作ってる深層学習向けプロセッサー、みたいなことを言うと、「TPUみたいなやつ?」と聞いてくる人がいたりする。深層学習向けに独自に作る価値がある計算装置として
トレーニング中は数日とかかけて、何回も同じ計算をするわけで、その計算は、例えば10分とかじっくり時間をかけて最適化しても割にあう。本質的に Python のオーバヘッドからは既にほぼ無縁な TF のグラフだけど、ターゲット向けにゆっくりコンパイルしてさらに速くする方がより良いでしょ、というのが XLA 。 ONNX を入力としてわいわいやってるのが NNVM
いろいろ話はあるけど、トレーニング向けは益がそんなに大きくないのかなあ、という気はしている。けどある程度の命令数を GPU でないアクセラレータでやるのであれば、なんかしらこういうレイヤのものは必要になるだろうしな
(20:55)
Codeforces & Microsoft の量子プロコンで触った。
http://codeforces.com/contest/1002/
最後の問題解けなかったのは、サイズ N の配列を返さないといけないところに、 N+1 個返してたからぽかった。残念すぎる。
問題セットはwarmupも含めてすごく良い感じだったと思う。解けないほど難しい問題はなくて、基本的かつ教育的な、僕にとっては「そういえばそんな話があった気もするなあ……」くらいの問題が並んでいる感じ。そういう全部解かれる前提の問題設計だったのか、そもそも量子情報で「あまりよく知られていなくて、量子性を利用していて面白く、十分に難しく、古典でのシミュレーションで実行できる」みたいな条件がそろう問題ってあまりないのか、まあどっちかというと後者なんじゃないかなと思うけど、それにしても基礎的な問題が多かった印象
ただ D1 と E1 の方が量子の面白さを伝える感じなのに対して、 D2 と E2 はひっかけ問題チックなので、イマイチかなあ…と思った。 E2 が時間かけたのにも関わらず解けなかった問題なので、言い訳くさいけど。
Q# は、言語としてもシミュレータを含めた環境としても、なかなかよくできているなあと思った。古典情報と量子情報の往復の部分とかは、そのまんま自力で書く感じ。量子→古典の移動は、観測を伴ってしまうので、まぁ明示的に書かせるのが良いのではないかと思う。あまりトランスペアレントにしたくないかなと。
一方で古典→量子の移動、要するに Qubit の初期化の部分は、これはなんか適当な状態を自由に作る手段があっても良いのかなあ……と思った。アルゴリズム考えてる時とか、「仮にこういう状態が作れるとしたら、こういうアルゴリズムは作れるだろうか?」と考えてから、「実際その状態、作れるの?」と考えたいこともあるんじゃないかなあ、と。シミュレータならいきなりそういう状態で初期化してくれれば良いし、実機では適当に精度指定すると存在するオペレーションでやってみてくれて、合成できない(オペレーション数が多すぎる場合も含めて)場合はエラーにする、とかで良い気がする。
PrepareArbitraryState というライブラリ関数もあるのだけど、 W state 作る問題で使ってみたら遅すぎるようだった。
(00:50)
https://drive.google.com/file/d/1QlDRAyAN926YoBuBb9auo4WZdhCyh7fC/view
面白い…
(14:16)
名古屋の宿の近くに、死ね金返せ系の落書きがたくさんある旅館があって怖かった
https://www.instagram.com/explore/tags/%E6%97%85%E9%A4%A8%E5%A4%A7%E6%9D%BE/
こういうの実在するんだな……バキの家みたいって思ったら、2chとかでも同じこと言ってて笑った
(14:20)
仕事にも使う予定なので、 Debian は微妙かなあと Ubuntu にすることにして、 16.04 はちょっと微妙問題があったので、 Ubuntu 18.04 でいってみることに
何度もする作業をメモ
最初にすべきこと
scp "i@xxx:.*" . sudo apt-get install ssh screen zsh chsh sudo apt-get install git subversion g++ make gauche ruby python3 python3-pip lv scp -r i@xxx:bin . scp -r i@xxx:lib . zsh git clone git@github.com:shinh/test.git svn co $SVN wrk cd ~/wrk/fake_isatty sh build.sh
sevilwm
apt -i libxrandr-dev cd ~/wrk/sevilwm rsync -avr "i@xxx:wrk/sevilwm/dev" . make sudo cp sevilwm /usr/local/bin
w3m
apt -i libgc-dev libimlib2-dev libncurses-dev scp -r i@xxx:.w3m . cd ~/wrk git clone git@github.com:shinh/w3m.git cd w3m ./configure && m sudo make install
apt-file
apt -i apt-file sudo apt-file update
適当に色々。 sevilwm に切り替える準備
apt -i ghc ocaml rlwrap emacs wicd gkrellm xscreensaver feh apt -i mlterm scp -r i@xxx:.mlterm . sudo vi /usr/share/xsessions/custom.desktop [Desktop Entry] Name=Custom Exec=/etc/X11/Xsession
CUDA
apt -i mesa-utils # follow nvidia's instruction for CUDA... sudo apt-get install -o Dpkg::Options::="--force-overwrite" cuda-9-0 sudo dpkg -i libcudnn*.deb
MLフレームワーク
pip3 install cupy # gcc-7 でコンパイル通らんので編集 # sudo vi /usr/local/cuda/targets/x86_64-linux/include/crt/host_config.h pip3 install cupy pip3 install chainer pip3 install tensorflow
UIM SKK
apt -i uim-skk ddskk uim-pref-gtk3
忘れがちな開発ツールまわりの
apt -i autoconf automake libtool texinfo flex bison glibc-doc libc6-dev:i386 libgcc-7-dev:i386 libstdc++-7-dev:i386 lib32gcc-7-dev valgrind
(20:38)
(09:08)
https://gqjapan.jp/culture/column/20150730/welcome-to-pariah-ville/page/4
最初はキツいなあ、と思ったけど、バランス取れた感じの、いい記事だなあと思った。
(20:06)
https://r25.jp/article/560392031878166383
そうそう、やっぱホリエモンいい人ぽいよね、と思ったけど、よく考えると割と普通のことばっか書いてあった
映画のジャイアンみたいな…
(17:14)
適当に色々走らせてみる。
CPU-avx2-256 50.062899 GFLOPS t=150 CPU-avx2-512 36.600433 GFLOPS t=14 CPU-avx2-1024 41.914810 GFLOPS t=10 CPU-blas-256 245.587644 GFLOPS t=732 CPU-blas-512 359.621543 GFLOPS t=134 CPU-blas-1024 507.372811 GFLOPS t=24 GPU-mine-64 64.069479 GFLOPS t=12221 GPU-mine-256 246.106109 GFLOPS t=734 GPU-mine-1024 137.683075 GFLOPS t=10 GPU-cublas-64 68.099346 GFLOPS t=12989 GPU-cublas-256 1666.332399 GFLOPS t=4967 GPU-cublas-1024 3462.507099 GFLOPS t=162
CPU-avx2 は Haswell 向けになかむらさんの文章見て適当に書いたコード。当時は BLAS とここまで差が無かったと思うし、なんかヘンなので後で見る。
GPU-mine はもっとどうでもいい、本気で適当に書いたもの。おいおいこんな適当なコードで BLAS に勝つんかと思った
GPU 自体は GTX 1060 3GB というやつで、 Pascal 世代らしい。 1152 コアで最大 1.76GHz 。理論は 4TFLOPS らしい?
次は、最近買ったノートPCにて
CPU-avx2-256 37.796423 GFLOPS t=113 CPU-avx2-512 26.427590 GFLOPS t=10 CPU-avx2-1024 36.619350 GFLOPS t=10 CPU-blas-256 4.165613 GFLOPS t=13 CPU-blas-512 4.127086 GFLOPS t=10 CPU-blas-1024 3.944004 GFLOPS t=2 GPU-mine-64 29.070758 GFLOPS t=5545 GPU-mine-256 57.308421 GFLOPS t=172 GPU-mine-1024 20.952593 GFLOPS t=10 GPU-cublas-64 46.641611 GFLOPS t=8897 GPU-cublas-256 505.182081 GFLOPS t=1506 GPU-cublas-1024 1028.495491 GFLOPS t=48
CPU-blas の成績は明らかにおかしい。 GPU は MX150 というやつで、こいつも Pascal 世代らしい。 384 コアで最大 1.04Ghz 。理論(?) 1.127 TFLOPS、かな?
10 万強で 1kg 強の ノート PC で TFLOPS 出てるんだなあ
(22:58)
いくつか目星つけてたノートPCを見るために秋葉フラフラしてて、ピンと来るやつないなあと思ってたところふっと見つけて、えっこんなのあるの、って買ったやつなんだけど、すごく良い気がする
20万以上出しても、ここまで僕の要求を都合良く満たすスペックのやつが見当たらないくらいな気がする。安くて良いものが好きな貧乏症としてはとてもいいものだった
(13:09)
ディスクを整理したい時、長年 DU='du | sort -n' という alias を愛用してたのだけど、止めたくなっても途中経過見られないのが嫌だったのと(まあ止めて走らせなおせばキャッシュに乗ってて十分なことも多いけど)、最近はケタが大きくてぱっと見でよくわからないので、一念発起してスクリプトを書いた
https://github.com/shinh/test/blob/master/DU
というかんじ。まあ便利そう
(16:53)
前 | 2018年 7月 |
次 | ||||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
全てリンクフリーです。 コード片は自由に使用していただいて構いません。 その他のものはGPL扱いであればあらゆる使用に関して文句は言いません。 なにかあれば下記メールアドレスへ。