留学・音ゲー・研究備忘録

heine98の音ゲー・研究・留学の記録

Julia - PyCallとPythonのモジュール

JuliaでPythonのモジュールを使いたいことがある。これはPythonのモジュールが充実してて、Juliaのパッケージにはまだないような洗練されたNonlinear Optimization Solverがある、などである。

 

さて、問題は、そのPythonのモジュールをシェルから起動できるPythonに対してインストールしても、Julia上で呼び出せないことにある。何故か?それはPyCallをJuliaにインストールした際に、Juliaが独自のPythonを所有してそれを使っているからだ(MacWindowsの場合は確実に。Linux系はよくわからん)。

つまりシェルから起動するPythonと、Julia経由で使うPythonは違う。

 

そこで別にCondaとか使ってPythonパッケージがJulia用Pythonへインストールできるのならいいのだが、今回使ったDFO-LSというモジュールがCondaで直接インスコできないものだからまあ面倒くさい。

 

結局解決策として、

1.JuliaがPyCallで呼び出すPythonをシェルから起動するPythonに統一

2.シェルから起動できるPythonにDFO-LSをインスコ

というステップをとった。

 

1.

PyCallで呼び出すPythonの変更は、Julia上で

ENV["PYTHON"] = "/PATH/"

と変えて、パッケージモードで ”build PyCall”を行い、Julia再起動。ここで注意したいのが、/PATH/部分で、要はここはシェルから起動させるときに使っているものと統一させる。

ここは今日やっと理解したのだが、シェルに直接JuliaとかPython3とかって打って起動させるのはたいてい/Usr/bin/や/bin/、/Usr/local/bin/ あたりにそれがコマンドとして定義されているかららしい。

つまり、いつもシェルからPython3.7と打って起動している場合は、そのPython3.7がどこで定義されているかを探して(今回はUsr/local/binだった)、そのパスを/PATH/に代入すれば良い。

なお、それを探すにはシェルでls /Usr/とかやれば見れる(ここらへんまじ素人)

もしJuliaのPyCallの中のPythonと自分がインストールしたPythonのバージョンが違うなら、Julia再起動後に

using PyCall

PyCall.pyversion

でバージョンチェックできるので、そこでわかる。同じだったらわからん。

 

2.

PythonのモジュールがマイナーでCondaかAnacondaかよくわからんがそのリストの中になく、

PackagesNotFoundError: The following packages are not available from current channels:

とか出てくる場合。今回のDFO-LSはGitHub上にしかなかったっぽい。(書きながら気づいたけどChannnel追加とかで対応できたのかな…でもAnaconda Cloudで検索したけどなかった。)

そこでpipという管理ソフト?を使ってインストール。今回Python3.7を上記の方法でJuliaに使わせており、シェルのコマンドもPython3.7だったので、シェルで

Python3.7 pip -m install HOGE

でインストール。HOGEはもちろん入れたいモジュールの名前。

 

 

Juliaで使うPythonの種類を変える

PyCallで利用するPythonのパスを変えたい : mwSoft blog

conda パッケージを Juliaから追加しよう

2個めのリンクのCondaの変更についてはあんま良くわかっておらん(今回必要なさそうだった)

 

非Conda系モジュールのインストール

Anaconda 環境に独自にモジュールを追加する - datalove’s diary

 

各々別々の説明はあるのだが、非Conda系ゆえpipなどを使わなければならず、よってデフォのPyCall紐付きPythonが使えないとかいう特殊な状況だったので。

Julia v1.0 覚え書き

v0.6.4を使っていたのだが、大幅なコード書き直しになったためにv1.0を入れてみたところ、結構問題が生じた。v0.7を経由しなかった部分からくる問題もあるようだが、とりあえず以下のことがv1.0に変更した際に起きたこと。かなりマニアック。

 

1.パッケージはパッケージ用のrepl?かなんかでやる。

今まではPkg.add("hoge")で追加したりしていたが、今回から(v0.7から?)変わっている。というか昔のstack overflowでREQUIREとかのファイルを旧ヴァージョンから移動してPkg.update()でなんとかなると書いてあったので試したのだがうまくいかない。仕方なく、Documentationにある方法で手動で入れ直したので書いておく(英語サイト)

Pkg · The Julia Language

要は、Juliaを実行後に"]"を押してパッケージモード的なところに入れば良い。その後、add hogehogeパッケージを導入できる。

インスコした直後なら、先に3.を見て、どうやったらうまく最新バージョンが立ち上がるか見てほしい(まあMacならアプリケーションからダブルクリックで立ち上がるけど)

自分用:現状入れてたパッケージは(この他にも導入中に追加で入れられたものもあるが、とりあえずこれさえ入れれば大丈夫なはず)

Distributions
Atom
NLsolve
NLopt
Optim
DataStructures
PyPlot
Roots
DataFrames
CSV

 

 

 

2.Parallel computingでかなりの変更が生じている。

これは経済学のコンテクストで語るしかないのだが、Jesus&Davidのペーパーを見てみよう。

https://www.sas.upenn.edu/~jesusfv/Guide_Parallel.pdf

github:

github.com

さて、書いている時点ではコードにめぼしい変更がなされていないので、以下の変更が必要だとわかった部分である。(https://docs.julialang.org/en/v1/manual/parallel-computing/index.html

JuliaのParallelizationで@parallelのコードだが(Julia_main_Paralell.jl)、まず最初にv1.0ではParalleliztionをするにあたって明示的にDistributedモデュールとSharedArraysモデュールを宣言しなければならない。

したがって、最初の何行かで

 

using Distributed

@everywhere using SharedArrays

 

が必要になる。

更にクソな変更が、47行目あたりでSharedArrayを宣言したときのことである

 

tempV = SharedArray{Float64}(ne*nx, init = tempV -> tempV[Base.localindexes(tempV)] = myid())

 

このライン、まずv1.0では少なくとも”Base.”が不要になった。更に"localindexes"が"localindices"に変更されている。加えて、これはSharedArrayの問題ではないのだが、"=myid()"の代入部分で"."を加える必要がある。したがって。v1.0では

 

tempV = SharedArray{Float64}(ne*nx, init = tempV -> tempV[localindices(tempV)] .= myid())

 

が正しい形となる。

だが、これでも回らない。ここからはよくわかっていないのだが、

 

MethodError: Cannot `convert` an object of type RemoteException to an object of type Array{Int64,1}

 

が出てくる。つまりこれはこの行のステートメント実行中に背後でconvertできない問題が生じているわけだが、ここからはパッケージの中身の問題なので俺には何もできない。

そういう意味で、現状ではv1.0でParallel Computingなコードは核のh避けたほうが良さそうだ。。

 

3.Atomでうまくv1.0を動かす。

(Introducing Julia/Getting started - Wikibooks, open books for an open world)

Juliaを公式のバイナリ?経由でインストールした場合、アップデートではなく違うバージョンが独立にインストールされることになる。

なんかHomebrewのパッケージ管理ソフトかなんかを使えばまた違うらしいのだが、とにかくわからんので今まで使ったことはない。

まあ問題は独立して存在する2つのバージョンがあってもいいのだが、AtomにJunoだかなんかを入れて統合環境?的なのでJuliaを使ってるので、Atom内のコンソールでJuliaを立ち上げたときに昔のJuliaが立ち上がり、最新のが立ち上がらない。これに関しての対処法は

(1)まずターミナルなどでjuliaと打って起動させる場合のヴァージョンを変える

Macならターミナルで以下を実行(v1.0の場合、それ以外は1.0を適宜変更)

sudo ln -fs "/Applications/Julia-1.0.app/Contents/Resources/julia/bin/julia" /usr/local/bin/julia

これでデフォルトのjuliaがどのバージョンになるか決まる。

(2)Atom内のJulia>SettingsでJulia Pathをデフォルトにしておく

つまり過去にここの部分を過去にいじったことがなければ、特にやることはない。

 

これでAtomからJuliaの最新バージョンが立ち上げられる。場合によってはJunoパッケージが必要になるっぽいので、まず先にターミナルでJuliaを実行し、パッケージREPL?(素人なのでここらへんの細かい用語わからん)からadd Junoを実行しておく。

 

 

海外一人暮らしの昼飯事情

3年生になって昼飯に弁当を持っていくことを始めた.

結局,最初の一人暮らしかつ海外とかいう難題に対処するには,きょうの料理ビギナーズの本を参考にするのでなく,つくおきのサイトを舐めるように見て,できる範囲でアレンジして,弁当の主菜以外が毎日同じでも耐えられるようにすべきだった.

 

弁当箱を日本で買ってきて(これはTokyo centralでもなんとかなる),米を炊き,毎日スクランブルエッグ,ベーコン,冷凍ブロッコリー,プチトマトにし,最後に主菜だけ毎週末の作り置きで調整することでなんとか1ヶ月耐えた.

どうせ毎日フードトラックの同じメニュー(メキシカンチキンオーバーライスか麻婆豆腐)で耐えてきた身としては,なんとかなる.

木曜のランチセミナーでピザも食えるからね.

 

 

 

しっかしアル中が治らん.

2つ目のTA

今期は中級ミクロです。なんでミクロ…。
昔はこういうところで自分の理解が上手くいかなかったから、もしも教えるようなことがあったらちゃんと説明しようと思ってたんだけど、いざ時間が経っちゃうと人って簡単に忘れちゃうモノなんですね…。

VISA更新

日本(米国外)にいないと出来ない。ビザが切れてもI-20ないきDS-2019が有効なら合法的に滞在できる。

今回の持ち物(J1かつ予約不要&SEVIS費用タダの場合=フルブライトなど)
【必須】
DS-160
写真
パスポート
DS-2019
レターパックプラス

【補足】
戸籍謄本(全部、コピーに英訳つける)
フルブライトレター
大学から給与もらってるのがわかるもの(メールをプリントした)
SSNカードコピー(持ってたので)
残高証明書


郵送の申請だったら面接予約フォームから色々やるみたいだったが、大使館に行ったのでこれで良さそうだった。
まあ今日行ったのでまだパスポート返ってきてないが。

PC壊れた

というかブルースクリーン
1年前に買ったLet's note、ググってメモりチェックなりディスクチェックなりも何度も試した。
直前に仮想デスクトップ上でJulia入れ直したくらいで特に新規インストールした覚えもないが…残りは初期化くらいしか手がない。

最悪なことにちょうどコンピュテーションの宿題が出てたので困った。たしかにこの課題で6時間matlab回してたけど、それか?

とにかく使い物にならなくて困っていたが、スペアで持ってきたmacbook airがあったのでそっちにmatlabを学校のライセンスで入れ直して使っている。とりあえず耐えてくれてる。


もし留学するなら念のためPCは2つ持って行くことをおすすめします。