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

heine98の音ゲー・研究・留学の記録。Juliaとかlatexとか使います。

Numba使うとSegfault出るが?+Julia vs Python

表題の件なんですが、どうもNumbaのアップデートすれば大丈夫っぽいです。ネット見る限るPython3.4.Xあたりからの問題で、発生当時numba0.44.1、Python3.7.5でした。 アップデートはpipつかってるなら

pip install -U numba

でした。これいちいち手動でやんの。。。?

なんでこんなこと気づいたかというと現実逃避にPythonRBCのVFI書いてたんですね。本当のVFI(pol funとしてgrid上しか選ばない=非線形ソルバー使わない、Concavity使わない)

で、これ条件同じにしてもJuliaよりPython+Numbaのほうが早くね…? 100グリッド1e-6精度で

Python: 8.55s (ただしfor loop

Python+Numba: 0.62s 1.27s

Julia: 0.23s 1.80s

とかですね。全部10iterごとにmax diffの表示させてます、Juliaで真面目には書いてないけど、そこまで変なことしてないはずなんだが。なお@inbounds使った上で2回め以降の結果です。

んーでも、他の超単純な常微分方程式の数値解を求める、みたいなネットに転がってるものをコピペしてみると、普通にjulia 0.53s vs Python+Numba 1.90sとかですね。まあ、今の所あんまり細かくPythonでコード書けないし、numba使うとエラーが全然不親切だし、ターミナルからあんまり回す気にならんし juliaみたいにインタラクティブモードに入ってどうこうするってことができなくて、常にターミナルからファイル実行しなきゃいけないのは不便ですね。もしかしてちゃんとやり方あるのかな?juliaは関数で全部処理するから使い回しも簡単なんだけど、そこらへんPythonだとmoduleなんですかね。あんましわからんのよね。Juliaにもモジュールあるけどまだちゃんと使いこなせてない。

(追記:普通に無駄なArray一個消したらめちゃ早くなったし、Juliaのほうが早くなった。それでもjuliaでAllocationが少し大きすぎる気がするのでおそらく不要な部分あり。

で、まあもうこんなことで時間使うの無駄だなって感じてきたから、以下だと信じてPythonは除外する。 まず、Numbaを使えばJuliaより早くなる場面は多い。ただし制約としてNumpyの関数を明示的に使う必要があり、最初からそうしておかないと、普通のコードからNumbaように書き換える二度手間が発生する。例えば絶対値のabsは標準の関数として存在するけど、Numbaを使うならnp.absoluteと使わないと警告が出る。

また、上でも述べたように、Numbaのエラーは何なのか、少なくとも慣れてない俺にはわかりにくい。 更に、まずNumbaで回す前になしで回るか確認して、そこからNumbaを追加して計算するということになるが、そのNumbaなしの計算が苦痛。

なので、最初に投資したJuliaで今後も行くことになるだろう。まあ趣味の範囲でPython数値計算勉強するのはいいと思うけど、今から研究にPythonを使うかっていうのは選択肢から当分除外する)

ところで、古い情報だと@autojitとか使うような書き方されてるけど、もうdeplicatedらしいので、

from numba import jit

@jit

でいいっぽいですよ。

冬休みですね

発表は終わったので、学生特権の長い冬休み、年末年始は日本へ帰ります。

まあそれはそれでリアルの話なのでいいのですが、ソシャゲそろそろ色々起こるので頑張らないとですね。多分一番頑張らなきゃいけないのは研究なんですけど。

プリコネはストーリーの自力開放を目指してて26-14までなんとか来たんですが、多分間に合わないかな。少しレベル上げるかランク上げないと、現状ではサポ借りても厳し目だったので。ランク上げるとなると16日からの泥2倍まではあんまり回りたくないという。レベルだけでなんとかなるかなー。ちなみにPLv120のキャラLv117前後。 そして王都終末決戦が特定キャラのみという話なのも気がかりですが。。。まあマナ無しでサポ借りられるっぽいし、そこに期待か。 課金してまでで手に入れたクリチカをいつになったら育てられるのか。というか現状魔法パ組めるほど魔法形育ってないけど。

あとはFGOも5章が来るので、これはかなり楽しみですね。ストーリーかイベントがない限りあんまりやる気線。ってか今回のボックス35箱分しか回れなかった。 低レアキャラは当分育てられそうにないです。てかボックス10箱までしか開けてないな。

バンドリはExトライ目標があんまり進まない。フルコン取れって言われると逆に緊張して落とすんだよな。

ていうか、発表終わったから朝ゆっくり寝たいのに、7時位に自然に目が冷めてそこからソシャゲ周回とネトサしてると寝られなくなっちゃう。これよくない。 最近目がしょぼしょぼするなとか、肩こりからの頭痛がよく起きるんだけど、これ多分普通に寝不足な気がする。 今日は金曜日だし、早めに寝て明日の朝hゆっくりしたいなぁ。。。

諸々

昔から怒られることや避難されることに人一倍敏感で、そういうシチュエーションがとても苦手である。部活でクソ怒られたからかなと思ったけど、小学校の頃から怒られないようにするための努力してたな。 で、研究ってのは絶対に批判されるものであり、それがひいては分野の発展につながっていくとは頭でわかってるのですが、プレゼンで教員からくるツッコミが今から怖い。特に久しぶりに自分の研究だから、全部自分の問題になるわけで。 もちろん人格を攻撃されてるわけじゃないんだから、それから研究のブラッシュアップにつなげていけばいいのだけれど。嫌だなあ。あと2日プレゼンの練習しなきゃ。

メールボックス確認したら夏の間のペーパーに対して2nd advisorからっぽいフィードバックが入ってたけど、何書いてあるか読めない。てか、これ本当に2ndなのか、もしかしたら1st advisorかもしれんけど。

あと、先日何人かと話してリサーチクエッションに対する姿勢の話になったとき、ある人はミクロデータに基づかなきゃだめでしょという話になり、Empiricalやりたくないマンとしては辛い。ただ、別にデータにもtづかなくてもnormativeな研究はある程度マクロのモーメントと合っていれば、contributionは別のところにあるのだからいいと思うなというのが私の立場だが。

プリコネが23−13まで来た。ノマ2倍期間でなんとか主要6人をR12装備5つまで強化できたし、あとは特別イベントまでに自力でストーリー開放できるかって感じ。別に今開放できるのは知ってるけど、どうせなら自力で行けるとこまで行きたいじゃん。

ガルパ、Extremeの25で落ちるものもアレば26でもクリアできるのもあり、詐称のレベルの話になってきた気がする。やっぱお酒飲まなければ音ゲーやるチャンスが生まれていいですね。 ただ弐寺のアプリは昨日リリースということでやってみたけど、オープニングからBGMがうまく流れなかったので、Oneplus7Tだとちょっとうまく行かないのかも?

FGO、絆創膏も集めるのサボってて40箱以下でフィニッシュしそう。せめて特別クエストと高難易度はやっておきたいけど。

Julia 並列化

マルチスレッドとかなんもわかってないけど。コアが物理でスレッドが仮想(コア内に2こくらいある)でおk? とにかくとりあえずメモ。今後追加していく。現状、Julia v1.3である。 なお以下の内容は

Announcing composable multi-threaded parallelism in Julia

をかいつまんだもの。

スレッドの数を設定

Julia起動前にターミナルで

$ export JULIA_NUM_THREADS=n

を実行。ただしnは任意の整数。もちろんコンピューターが持ってるスレッド以上の数を指定しても以下では無視されるけど。

正しく設定できてるか確認

上記のセットが終わればJuliaを起動して、

Threads.nthreads() # いくつスレッドが使われてるか
Threads.threadid()  # 現在のスレッドのID

# またはタスク振り分けを画面に表示させてみる
Threads.@threads for i = 1:10
           println("i = $i on thread $(Threads.threadid())")
       end

テスト

並列化の恩恵について以下の関数で見てみる。関数自体は1次元配列vを受け取ったときに中身をソートするものだけど、vがある一定サイズの場合、並列化を行う。 最初に入れたvを半分に分割し、1~size(n)/2までの方を並列化、一定サイズになるまではそこに再帰的に関数を適用している。

import Base.Threads.@spawn

# sort the elements of `v` in place, from indices `lo` to `hi` inclusive
function psort!(v, lo::Int=1, hi::Int=length(v))
    if lo >= hi                       # 1 or 0 elements; nothing to do
        return v
    end
    if hi - lo < 100000               # below some cutoff, run in serial
        sort!(view(v, lo:hi), alg = MergeSort)
        return v
    end

    mid = (lo+hi)>>>1                 # find the midpoint

    half = @spawn psort!(v, lo, mid)  # task to sort the lower half; will run
    psort!(v, mid+1, hi)              # in parallel with the current call sorting
                                      # the upper half
    wait(half)                        # wait for the lower half to finish

    temp = v[lo:mid]                  # workspace for merging

    i, k, j = 1, lo, mid+1            # merge the two sorted sub-arrays
    @inbounds while k < j <= hi
        if v[j] < temp[i]
            v[k] = v[j]
            j += 1
        else
            v[k] = temp[i]
            i += 1
        end
        k += 1
    end
    @inbounds while k < j
        v[k] = temp[i]
        k += 1
        i += 1
    end

    return v
end

重要なのは

half = @spawn psort!(v, lo, mid)  # task to sort the lower half; will run
    psort!(v, mid+1, hi)              # in parallel with the current call sorting
                                      # the upper half
    wait(half)                        # wait for the lower half to finish

    temp = v[lo:mid]                  # workspace for merging

再帰的に関数を適用してるから、結果的には最初の2分割で上下ともに並列化されてるんだと思われる。

MacBool Pro 13 inch 2017、2.3 GHz デュアルコアIntel Core i5での結果は

julia> a = rand(20000000);

 b = copy(a); @time sort!(b, alg = MergeSort);   # single-threaded
  2.120218 seconds (111.87 k allocations: 82.144 MiB, 31.72% gc time)

julia> b = copy(a); @time sort!(b, alg = MergeSort);
  1.985665 seconds (11 allocations: 76.294 MiB)

julia> b = copy(a); @time psort!(b);    # four threads
  1.760655 seconds (332.00 k allocations: 702.748 MiB, 4.95% gc time)

julia> b = copy(a); @time psort!(b);
  1.101960 seconds (3.77 k allocations: 686.923 MiB, 4.72% gc time)

と早くなってるのがわかる。

とまあ、参照したサイトのはわかるけど、これをどうやって数値計算に落とし込むかが〜〜〜。

デバフ

ルカはUBで防御デバフあるからTP貯めるために星あげないほうがいい マコトもUBにあるけど柔らかすぎるので耐久上げるために星上げたほうがいいってことね。

次のプリフェスって年末かな。クリスが引きたい。そしていつジュンさんは来てくれるのか。

そういえばなんかゴリ押しでダンジョンExtremeの方行くほうが、育成整えるより早そう。。。まだ当分はかかるけど。

latex + VScode

メモし忘れてたから、念の為。

latexvs codeはhomebrewなりなんなりでインスコ済みとする。 vs codelatex workshopを使うとき、ちゃんとwaorkshop側にlatexビルドできるようにするために、まず最初にユーザーのホームディレクトリに(cdだけでいけるとこ?)に.latexmkrcファイルを作成する必要がある。 内容は現行のPCの中をコピペすればいいけど、参考としては以下のサイトを参照のこと。 qiita.com

ただしこれをやると、workshop側でビルド時にpdfがVS code内のタブで開く設定にしててもskimが勝手に開くので、手動でpdf用のタブを開く必要があるっぽい?しかもskimとtabで同じpdfを見てるアホな自体になると思うけど。

クリイベの時期重なりすぎ問題

ずっとFGOだけやってたんだけど、夏からプリコネ初めて最近は酒を飲むのもやめたのでバンドリも始めたが、イベントが重なりすぎてる。 そして迫りくるワークショップの発表、どないしろっちゅーねん。

プリコネ、経験値1.5倍なのと、自力でストーリー開放したいから頑張ってるんだけど、これはスタミナパックないと無理ですね(買った アメリカのカードで課金できるのを再度確認したので助かった。 クラバト前からの育成で育ててた分、21−14まで一気に進めた(18−9で詰まってたのは暗闇の敵に対処しないで脳筋前衛物理パでやろうとしてたからだった。 でもここからはまたR12とか120くらいまで育てないと行けないので5日に来るであろうノマドロ2倍で周回できるように今のうちにイベント走っておきます。そろそろVHの敵も2凸位できそうだけど面倒くさいからハードだけしかやってない。

FGO、19箱だけど開けたのは10まで。そして礼装全然落ちない。今日のストーリーで剣トルフォ使えたのだけど、バトルボイスがいいので欲しくなってしまった。でも我慢。

バンドリ、そろそろExtreme?赤の難易度で埋めていきたいけど、イベント多すぎなのとスタミナ消費してからじゃないと練習できないのが苦しい。あと練習するにもライフゼロで落ちるので、そう考えると最後まで演奏できる弐寺は良かったな。