経済学修士残酷物語

東京の経済学修士のブログ。自分の専攻や統計学から最近読んだ本や雑記まで

MacOS版R4.0にOpenBLASをリンクさせる

以前からRの高速化については少し興味があって,この記事を見て割合簡単にできそうだなと思い試してみた記録です. 結論から言うと,自分の環境上ではデフォルトのBLASからOpenBLASに切り替えたところ,ベンチマークでは3~8倍程度高速化しました.特に行列計算での向上が大きく寄与していました.

Rを含めてhomebrewでパッケージ管理をしているのですが,OpenblasとRのリンクについてはbrew単独ではうまくいかなかったのでまとめてみます1

環境

  • OS: MacOS Catalina 10.15.5
$ system_profiler SPHardwareDataType
Hardware:

    Hardware Overview:

      Model Name: MacBook Air
      Model Identifier: MacBookAir9,1
      Processor Name: Quad-Core Intel Core i5
      Processor Speed: 1.1 GHz
      Number of Processors: 1
      Total Number of Cores: 4
      L2 Cache (per Core): 512 KB
      L3 Cache: 6 MB
      Hyper-Threading Technology: Enabled
      Memory: 16 GB
  • R: 4.0.3

homebrewの導入などは省略します.

準備(インストールするもの)

  • gcc:OpenBLASのコンパイル用です.Rをbrew経由で入れている場合は既にインストールされていると思います.brew install gccで入れてください.
  • openblas: こちらもbrewから入れることができます.--build-from-sourceのオプションを付けてソースからビルドしない場合,最適化されないようなので注意してください.
  • ベンチマークスクリプト: R-benchmark-25.Rを用います.乱数生成に際してSuppDistsライブラリが必要ですが,スクリプト内のコメントのように標準の乱数生成関数に変更することもできます.

速度比較

RがリンクしているBLASを確かめる際の手順はこちらの記事を参照してください.

標準BLASの結果

❯ cat R-benchmark-25.R | time R --slave


   R Benchmark 2.5
   ===============
Number of times each test is run__________________________:  3

   I. Matrix calculation
   ---------------------
Creation, transp., deformation of a 2500x2500 matrix (sec):  0.545666666666667
2400x2400 normal distributed random matrix ^1000____ (sec):  0.176
Sorting of 7,000,000 random values__________________ (sec):  0.836999999999999
2800x2800 cross-product matrix (b = a' * a)_________ (sec):  18.3796666666667
Linear regr. over a 3000x3000 matrix (c = a \ b')___ (sec):  9.76233333333334
                      --------------------------------------------
                 Trimmed geom. mean (2 extremes eliminated):  1.64589517363295

   II. Matrix functions
   --------------------
FFT over 2,400,000 random values____________________ (sec):  0.272333333333331
Eigenvalues of a 640x640 random matrix______________ (sec):  0.989333333333339
Determinant of a 2500x2500 random matrix____________ (sec):  3.89733333333334
Cholesky decomposition of a 3000x3000 matrix________ (sec):  6.442
Inverse of a 1600x1600 random matrix________________ (sec):  4.22166666666666
                      --------------------------------------------
                Trimmed geom. mean (2 extremes eliminated):  2.53433902483476

   III. Programmation
   ------------------
3,500,000 Fibonacci numbers calculation (vector calc)(sec):  0.224666666666659
Creation of a 3000x3000 Hilbert matrix (matrix calc) (sec):  0.214666666666668
Grand common divisors of 400,000 pairs (recursion)__ (sec):  0.309333333333323
Creation of a 500x500 Toeplitz matrix (loops)_______ (sec):  0.0759999999999934
Escoufier's method on a 45x45 matrix (mixed)________ (sec):  0.60899999999998
                      --------------------------------------------
                Trimmed geom. mean (2 extremes eliminated):  0.246174647838452


Total time for all 15 tests_________________________ (sec):  46.957
Overall mean (sum of I, II and III trimmed means/3)_ (sec):  1.00887354980068
                      --- End of test ---

R --slave  221.80s user 2.71s system 99% cpu 3:46.49 total

OpenBLASに切り替え

上の記事に従って標準BLASのパスを確認したあとに,brew経由でインストールしたOpenBLASにリンクを張り替えます

$ ln -sf /usr/local/opt/openblas/lib/libopenblas.dylib /usr/local/Cellar/r/4.0.3/lib/R/lib/libRblas.dylib
  • 多くの記事ではbrew install r --with-openblasとしていますが,2020/10/24現在だとinvaid optionのエラーが発生します.今回はシンボリックリンクを張り替えることで対応しました.

OpenBLASの結果

OpenBLASを使用したRの性能を見てみましょう:

❯ cat R-benchmark-25.R | time R --slave

   R Benchmark 2.5
   ===============
Number of times each test is run__________________________:  3

   I. Matrix calculation
   ---------------------
Creation, transp., deformation of a 2500x2500 matrix (sec):  0.509333333333333
2400x2400 normal distributed random matrix ^1000____ (sec):  0.161
Sorting of 7,000,000 random values__________________ (sec):  0.967666666666667
2800x2800 cross-product matrix (b = a' * a)_________ (sec):  0.443666666666666
Linear regr. over a 3000x3000 matrix (c = a \ b')___ (sec):  0.273666666666667
                      --------------------------------------------
                 Trimmed geom. mean (2 extremes eliminated):  0.395451840253713

   II. Matrix functions
   --------------------
FFT over 2,400,000 random values____________________ (sec):  0.223333333333333
Eigenvalues of a 640x640 random matrix______________ (sec):  0.632666666666667
Determinant of a 2500x2500 random matrix____________ (sec):  0.285666666666666
Cholesky decomposition of a 3000x3000 matrix________ (sec):  0.38
Inverse of a 1600x1600 random matrix________________ (sec):  0.448333333333334
                      --------------------------------------------
                Trimmed geom. mean (2 extremes eliminated):  0.365102436446165

   III. Programmation
   ------------------
3,500,000 Fibonacci numbers calculation (vector calc)(sec):  0.253
Creation of a 3000x3000 Hilbert matrix (matrix calc) (sec):  0.212333333333333
Grand common divisors of 400,000 pairs (recursion)__ (sec):  0.261333333333334
Creation of a 500x500 Toeplitz matrix (loops)_______ (sec):  0.0456666666666668
Escoufier's method on a 45x45 matrix (mixed)________ (sec):  0.247999999999998
                      --------------------------------------------
                Trimmed geom. mean (2 extremes eliminated):  0.237062827419034


Total time for all 15 tests_________________________ (sec):  5.34566666666667
Overall mean (sum of I, II and III trimmed means/3)_ (sec):  0.324681290870627
                      --- End of test ---

R --slave  62.53s user 4.91s system 191% cpu 35.241 total

行列演算が30~40倍,コレスキー分解なども10倍程度速くなっており,冒頭で挙げた記事とも整合的な結果が出ました.

homebrewは楽で良いのですが,設定の最適化をする際にはこうして面倒を見る必要があるなという印象です.

参考資料


  1. 後々確認するとRのdependencyにopenblasが含まれており全くの無駄記事を書いている気分になりましたが,私の環境では標準BLASの方にリンクされていたのでそういうパターンもあるようです.

vimでRの開発環境を整えたい

いやRstudio使えば良くない?

背景

  • できるだけvim/ターミナル上で完結して操作がしたい
    • RAやバイトではpythonを使い、他にもhtml, javascript, rustをしばしば扱う
    • 言語ごとにエディターを使い分けるのが面倒だしクールだとも思えない
    • vscodeはRの機能が貧弱っぽい

環境

入れたもの

  • Nvim-R: R用プラグイン。バッファでRを立ち上げてコードを実行できるので簡易Rstudioが作れる

    • R_assignなどを設定することでRstudioよりも設定を最適化できる(と思う)
    • bufferの画面が小さくて気になる場合ははtmuxを使って別のsessionでコンソール開くこともできる。ディスプレイがないとちょっと不便
    • Rhelpですぐ関数のdocumentが見れるのも嬉しい
  • lintr: Rのlinterパッケージ。下のALEと組み合わせて使う

    • 個人的にはRmdからpdfファイルを作るときに重宝する。最長文字数制限がないと簡単にコードがはみ出てしまうという問題がある
  • ALE: 非同期型のlinterプラグイン。syntasticでも良いと思うが、新しいもの好きなのでこちらを採用している。

今のところ結構快適。スペースで行単位の実行ができたり、パラグラフ単位や選択範囲での実行など色々調整できるのが良い。

dein-lazy.tomlにはこんな感じで設定している:

[[plugins]]
repo = 'jalvesaq/Nvim-r'
hook_add = '''
  let g:R_assign = 3 " _ を<-に変換
  let g:R_in_buffer = 0 " tmuxのセッションにコンソールを開く
  let g:R_insert_mode_cmds = 1
  let g:r_indent_align_args = 0
  let g:R_parenblock = 0
  " スペースで行・選択範囲を実行
  vmap <Space> <Plug>RDSendSelection
  nmap <Space> <Plug>RDSendLine
'''
on_ft = ['R', 'r', 'rmd']

今後やりたいこと

  • deoplete周りとの補完の共存。まあ現状そこまで優先度合いが高そうでもない

カフェインは創造性を向上させない?

ちょっとした健康オタクとしてカフェインの効用について時々調べているが、最近気になる論文を見つけた:プレスリリース論文。 どうやらこの論文によれば、カフェインは問題解決や意思決定といった"正解"に近づくような認知タスク(convergent thinking)の効率を上げる一方で、ブレインストーミングのような発散的思考(divergent thinking)に関しては特にサポートしないらしい。

一般に、カフェインは集中力や記憶力といった認知的機能や運動パフォーマンスを向上させることが知られている*1。 また、アデノシン受容体と結合することによって、神経のリラックスとそれによる眠気の発生を防ぐ効果もある。気合を入れたいときのお供には最適というわけで、試験前の大学生やハードワークのビジネスパーソンはコーヒーやエナジードリンクを愛飲していることが多い。まあ、タイトルを見てこの記事をクリックした方には言うまでもないことかもしれない。

かくいう自分も、毎日必ずコーヒーを飲む程度には常用している。頻繁に摂取するとカフェインの効きが鈍くなるので一日一杯に留めたり、夕方以降は飲まないようにするなど、ちょっとした工夫もしている。

そういう経験を振り返ってみると、確かにカフェインを摂った直後は目の前の課題にぐっと集中できるのだが、創造性や発想力が必要な状況でカフェインの効用を実感した記憶はないかもしれない。

神経科学系の作法に詳しくはないのだが、該当論文は

  • サンプルサイズ88
  • 統制群にはプラセボ薬を投下したRCT

で検証しているようなので、結果はそれなりに信用できそうだ。

というわけで、午後からハードな問題解決を行うときには従来通りにコーヒーを飲む一方で、創造性を発揮したい場合は何か別の手立てを考えたほうが良いかもしれない。

東京大学経済学研究科の2020年度院試に関する覚書

はじめに

この記事は2019年9月3日に行われた東大経済研究科経済学コースの筆記試験、及び9月11日に行われた口述試験について、私が記憶している限りをまとめたものです。*1 東大経済の院試に関する情報が口伝になっているような状況も良くはないだろうと思って筆を執りました。

あくまで東大の経済学部に在籍している一個人が見聞き体験した情報に過ぎません。より確度の高い情報源があればそちらに当たるのが良いかと思います。また、外部生の方にはあまり役に立たない情報もあるかもしれません。ご了承ください。

昨年度の院試に関する情報はこちらにまとまっています。:

demachiyanagi.hatenablog.com

筆記試験

まず受験科目について。今年度から、経済学コース志望者の受けられる科目が

  • ミクロマクロ基礎
  • ミクロマクロ応用

の2つに固定されました。以前は応用の代わりに数学を選択したり、基礎の代わりに統計を選んだりすることができたのですが、今年からはミクロ経済学マクロ経済学で試験を受ける必要があります。

筆記試験を通過するボーダーは例年6割前後と言われています*2。 また、出願の際にTOEFLのスコアシートを提出する必要がありますが、こちらはほとんど見られないと言われています。50点代でも普通に合格するとかなんとか。

筆記試験で充分な点を取っていると口述試験は5分で終了するという体験談もちらほら聞こえており、提出書類や試験のうちで筆記がほとんどのウェイトを占めるというのは間違いなさそうです。

以下、今年の問題についての簡単な所感を述べます。その後、簡単に自分の試験対策について書きます。

ミクロマクロ基礎

  • ミクロ基礎: 大問が2つあり、競争均衡とクールノー競争の問題。どちらも標準的な問題だが、最後の設問で一捻り加えていた。競争均衡は厚生経済学の第一基本定理が成立しない状況の理解、クールノー競争は川上企業を導入した場合について問う部分。頻出分野であるし、落ち着いて解けば問題なさそう。

  • マクロ基礎: マクロ経済学に関するキーワード・コンセプトを説明させる問題とコブ・ダグラス型関数を生産関数に持った企業に関する問題。これも標準的だったが、フェルドシュタイン=ホリオカ・パズルを問われて多くの受験生が悲鳴を上げたと思われます。私も解けなかった。

ミクロマクロ応用

  • ミクロ応用: 労働市場において異質な主体が存在する場合の均衡に関する問題。さらに労働市場の独占が発生している場合についても考える必要があり、やや考える必要がありました。

  • マクロ応用: 借り入れ制約の下での消費者の効用最大化問題。例年通りミクロ的基礎づけのあるモデルを考えさせるものだったが、今年は供給側を捨象しているためやや簡単め。

口述試験

出願前に提出した希望専攻に応じて面接部屋が割り振られます。基本的に専攻分野の教授・講師陣が面接官となっているようです。部屋(専攻)によっては筆記試験の点数順に面接の順番が決まり、最初の方は5分ほどで終わるとかなんとか。当落線上にいる受験生は30分以上詰められるという噂もまことしやかに囁かれています。

以下、私が受けた質問です。記憶が曖昧なので、いくつか抜けているところがあるかもしれません。

  • (事前に提出した研究計画書について)どんな研究をするのか、30-60秒程度で説明してください。
  • 研究計画について予想される困難にはどんなことがありますか?
    • また、その対策としてはどんなことを考えていますか?
  • 専攻について、特に興味のある分野・トピックにはどのようなものがありますか?
  • 修士課程を修了後の進路はどのようなものを考えていますか?

修士課程以後についての質問について。意気揚々と「博士課程に進みます!」などと言うと撃沈するという噂を聞いたので、修士の状況を見て考えます、と返答をした覚えがあります。面接で聞かれることは、基本的に一定の準備をすれば詰まるほどではないと思います。

研究計画について、理論モデルを明確に書いているとその部分を詰められるということもあるそうです。私はそこらへんを簡単にしか書かなったためか、特にツッコミはありませんでした。

試験を受けるにあたっての準備

個人的に院試に役立ったと感じた教科書・参考書や、東大で受けた授業を書いておきます。面倒なのでリンクにアフィリエイトはつけていません。

ミクロ経済学(基礎・応用)

「力」はミクロ経済学の教科書であり、「技」は対応した問題集です。東大経済学部の2年生が履修する「ミクロ経済学」の授業における神取先生の講義・宿題をまとめたような内容になっています。

極力数式を排してわかりやすく書かれており、経済学的な直観を養う上では非常に有用だと思います。一方で院試問題を解く上での数学的なトレーニングには以下に紹介する問題集を使いました。

奥野正寛先生が編著を務めるミクロ経済学の教科書に対応する問題集ですが、私はこれ単体で使いました。第1版は確認していませんが、新版は問題数を増やしたそうです。一般均衡、パレート均衡を求める問題や情報の非対称性など、東大で頻出の問題はこれ一冊でカバーできます。

グレーヴァ香子先生が書かれた非協力ゲーム理論の教科書です。直観的な解説と数学的な定義が両方とも盛り込まれており、問題数も一定量あります。東大のゲーム理論の授業を取ることができなかったので、私はこれでカバーしました。

東大の大学院授業ですが、学部生も履修することができます。毎年Sセメスター(夏学期)に開講し、市場理論を扱います。最後まで受けることでかなり理解が深まったと思います。

マクロ経済学(基礎・応用)

通称「二神マクロ」です。自分はマクロにはあまり明るくないのですが、東大入試の準備という観点ではこの教科書をしっかりやっておけば困ることはないと思います。ミクロ的基礎づけのあるモデルから学部レベルのマクロ経済学まで、ほとんどカバーしています。

以上です。間違っている情報などあれば、ご指摘いただけると幸いです。

*1:2020年度試験が2019年に実施されるので紛らわしい

*2:統計コースの某教授によれば、合否の決定は相対評価ではなく絶対評価で決めているとのこと。怖い。