Juliaで作ったもの

antimon2氏:いろいろやってるんですけど「で、具体的になんか作ったものないの?」っていう話だと思うので、その紹介もしていきます。

まず公式に登録しているパッケージがあります。旧暦の計算をするライブラリで、自分の趣味と言うか、個人的な必要に迫られて作ったやつです。せっかくだから公開するかってことで公開して、ちゃんとJuliaのバージョン0.5以降で、1.0でも今動きます。

これは公式なので、「add QDates」っていうふうにパッケージREPLでタイプするだけで実行できます。実行結果はこんな感じです。using QDatesってやってQDates.today()ってやると、旧暦の今日の日付。これ昨日実行した結果なんで昨日の日付が出てるんですけど。1を足すと次の日になったり。1日だけじゃなくてもちろん1ヶ月前、旧暦の1ヶ月前の年月日を出したりとかっていうこともできます。そういうのを公開してます。

公式なパッケージは今のところこれだけなんですけど(笑)、ほかにもいろいろとGitHubで公開してるので。オレオレパッケージになってるやつは、addでURLを直接指定すればインストールできるようなものはいくつか置いてあるんで。興味があったらちょっと覗いてみてください。

仕事ではどうなのかっていう話なんですけど、実績はないです。実績ないって言うか、明確に外に向かって「Juliaでこういう仕事しました」「こういうプロダクトを作ってます」っていう実績がないだけで、仕事で使ってることは使ってます。

いくつかその中でも話題にのぼってもよさそうなやつを紹介すると、PCLっていうライブラリがあるんですけど、C++のライブラリで「Point Cloud Library」という、3次元上の点を見つけて、カメラで点を見たときの深さとか距離を測って、3次元の物体認識をしたり。そういうのに応用できるライブラリで、それをJupyter Notebook上でやれたらおもしろいねって話になってて。

それを実験するのにJupyterだったらJuliaでやってみようかって話してたんですけど、このときちょっとうまくいかなくて。(Juliaのバージョンが)0.5だったからってのもあったと思います。うまくいかなくて断念しちゃいました。案件そのものは違うかたちで納品までは持ってったんですけど、こういうことで実験はしてみてます。

もう1つ実験的にやったやつが、KinectとOpenNIを組み合わせました。KinectはMicrosoftのやつですね。あれでさっきと同じように物体の3次元的な距離とかを認識して、それをOpenNIを使って解析して、それをさらにJuliaで制御して、人を検知したり姿勢を検知するっていうのがとりあえずテーマで。

それをJuliaから利用するっていう実験をやろうと思ってたんですけど、これはそもそも案件そのものがお蔵入りしちゃって、日の目を見ることがなくて。そもそもKinectとかOpenNIっていうのが、今はぜんぜんもう出てこなくなっちゃって。残念ですけども、しょうがない。

社内ツールなどでJuliaを活用

あと細かい社内製ツールはJuliaで作ってるものもあります。というかオレオレツール類ですけど。例えばファイル一括変換。CSVの中身を一括で変換したりとか。ちょっとLinuxとか強い人はシェル芸でできるよ、ってレベルなツールとかも多いんですけど、一応Juliaでいろいろやってはいます。

ただそれだけだとアレなので準備を裏で着々と進めていて、それがさっきちらっと言ったユニットテストの話です。前回の自分の勉強会でも発表したんですけど、Qiitaの記事にもこの間まとめたやつで、例えばこんな感じです。Juliaでちゃんとテストを追加すると、コマンド一発でよくあるユニットテストみたいな感じで。これは、このときはパスして。エラーの例が出てないんですけれど、こういうのはちゃんとできますよと。

これのいいところは、ちゃんとユニットテストになってるって言うか、エラーが1個でもあれば終了コードが0じゃなくて1になるので失敗したってことがコマンドレベルでわかります。CIとかにもちゃんと使えるようになってるということです。

ほかにも例えば、ついこの間追加したんですけど、WiGっていう機械学習で使う新しい活性化関数を提案した人がいて。それ実際どうなのっていうのをJuliaで試しに実装してみて動かしてみたっていう実験なんですけども。これもGitHubで公開してます。

実行するとこんな感じになります。確かにある程度ちゃんと動くんですけど、WiG使わないほうが速かったんです。精度もそんなに変わらないっていうことがあったんですけど。とりあえずJuliaでちゃんと実装して実験をしてっていうことをやっています。

あとはそもそもJuliaでプロジェクトで作るにはどうしたらいいかっていうのと、Juliaの特有の書き方とか。あとJuliaと、Fluxっていうディープラーニングに使えるライブラリが今1番ホットだと思うんですけど、それを使って実際に機械学習のタスクを構築してそれを回すっていう回し方とか。いつでも誰でもJuliaで開発することができるように、社内のwikiみたいなところとQiitaにも少しずつまとめていこう、ということをやってます。

目に見える実績としてはGitHubにいくつか上げてるので、それを見てくださいレベルのことしかやってないって言えばやってないんですけども、一応そんなことをやってます。

ということで、実績の話も終わりで。そろそろ時間なのでまとめに入るんですけど、まとめとしては結局「I ♥ Julia」ってことで(笑)。以上です。

(会場拍手)

Fluxとの仕組みについて

bicycle1885氏:なにか質問ある方はいらっしゃいますか。

(会場挙手)

質問者1:仕事のツールでJuliaを使ってて、0.5から1.0とかに変わったときに、だいたいいろんなリポジトリライブラリが動かなくなったりあるじゃないですか。そういうの、ぶっちゃけ怖いなって思うときってないですか。

antimon2:実際ありますけど、逆に0.5とかの時代には、「まだちょっと早いな」っていう。絶対もうすぐ1.0出るから、それまではなるべくテンション抑え目にしておこうと思って。1.0が出てから、1.0で動くライブラリを中心にまとめてるところです。

だから今まで0.5を使ってたのは社内では自分だけだったので、それ以外の人には1.0を初めから使えばいいよという感じで勧めています。さっきの機械学習のライブラリにFluxっていうのがあるんですけど、それは1.0よりも前から出てて、1.0になったときにすぐ対応してたので。じゃあFlux使えばいいやと思ったので。

逆に最初のほうに出たMXNetとかは、1.0に今まだちゃんと対応してなかったりしてるので。そこは自分がうまいこと見極めて、誘導していこうというふうに考えて今やっていっています。

bicycle1885:ほかにはなにかありますか。

(会場挙手)

質問者2:Fluxの仕組みのことなんですけども、実際触ってみて良い点とか悪い点とかってどんなものが。

antimon2:Fluxの1つの特徴は、例えばconvolutionとかdenseとか、Chainerみたいな感覚で定義できます。だからネットワークがすごく組みやすいっていうのと、あと学習もだいたいフレームワークで、ここに投げれば学習してくれるっていう仕組みができてて。そういう意味でChainerとかkerasも似たような感じかな。そういうのでやってれば移行は簡単です。

Knetっていう別のライブラリも試してたんですけど、そっちはJuliaフレンドリーで、Juliaっぽく書いてそれを構築していく感じなんです。ただ、そのへんのネットワークの構築がちょっと面倒くさいのと、あと実際動かしてみて、CPUで動かしてもKnetよりもFluxのほうが学習がむちゃくちゃ速かった。なんかうまいこと最適化しているんだろうという。

そのへんはちょっと追い切れてはいないんですけど、ただそういうのも含めてFluxのほうがなんか使いやすそうだなっていう。今んところの感覚はそんな感じです。

bicycle1885:ほかにはありますか。……じゃあ、ありがとうございました。

antimon2:ありがとうございます。

(会場拍手)