non vorrei lavorare

ブログ名の通りです。javascript three.js mruby rust OCaml golang julialang blender

Windows(MSVC)でmrubyからGPU対応のTensorflowを動かせた

こんにちは、長男が高熱をだし、時期が時期なので、インフルエンザを疑ったのですが、陰性で、その後もしばらく高熱がつづいたのですが、今では熱が下がり、大好きなYouTubeを見てます。kjunichiです。

やったこと

タイトルの通りですが、以前このブログでも話題にしたmrubyかJuliaを呼び出せるmruby-juliaをWindowsのMSVC環境で動かせるようにして、 そこからJuliaからPythonを呼び出せるPyCallを経由して、すでにセットアップ済みのGPU対応のTensorflowを動かせました

JuliaをMSVC環境で動かそうとして分かったこと

.libファイルが必要

JuliaのWindows版はMinGWでビルドされているので、MSVCで動かすには.libファイルを作る必要がりました。

MSVCではCではJuliaを組み込めない

さらに、CからJuliaを呼び出すことは出来ず、C++からでないと、ダメでした。 そのため、mruby-juliaは元々Cオンリーであったのを、JuliaのAPIを叩く箇所をC++化して対応しました。 (mrubyでC++を使ったmrbgemを使うとちょっと問題があるのですが、これは別の記事で書く予定)

mrubyからTensorflowを呼び出す

事前準備

Juliaであらかじめ環境変数PYTHONGPUが有効なTensorflowが使えるPythonに設定した状態で、

Pkb.add("PyCall")

もしくは、

Pkb.build("PyCall")

しておく。

サンプルコード

j=Julia.new
j.eval("using PyCall")
j.eval("string(@pyimport tensorflow as tf)")
j.eval('sess = tf.Session()')
j.eval('a = tf.constant(10)')
j.eval('b = tf.constant(32)')
j.eval('sess[:run](pyeval("a + b", a=a, b=b))')
p j.eval('string(sess[:run](pyeval("a + b", a=a, b=b)))')

成果物

関連記事