google Colab を用いたオンライン学習の準備
はじめに
宇宙の研究を始める人向けに,google Colab というオンラインでpythonや,GPU/TPUが使える環境を用いたオンライン学習の方法について紹介する.(2020.4.11) 自分で既に環境がある人はもちろんそれでも構わない.
まだパソコンやソフトウェアの前提知識を入れてない人は,
を先に一読ください.
この記事の内容の google colab は、
においてますので参照ください。
google Colab とは?
グーグル社員が使っているものと同じツールを,世界中の人が使えるようにと開発されているものである,デフォルトでCPUを使うが,GPUやTPUにも変更できる.ここで,CPUやメモリは自分のマシンではなく,googleの保有するマシンを使うことになる.つまり,自分のマシンが非力でも,たとえばスマホからであっても,動作速度は関係ないのである.実際にプログラムが走るのは,自分のCPUやメモリではなくて,世界のどこかにあるgoogleのマシンなのである.また、Python環境だけでなく、GPUでディープラーニングするためのCUDAやTensorFlowを含めて人気ライブラリ数百種類がインストール済みなので,すぐに機械学習やディープラーニングを試すことができる.詳しくは,google Colab などを参照してほしい.ただし,多くの人が使うと負荷が高すぎてしまうため,長時間の実行などは制限がある.宇宙の研究をする人の場合は,用途としては,ちょっとしたお試しや,基礎を学ぶためで,実際にガッツリやるときには自分のローカルに環境を構築するだろうから,特に問題はないでろう.オンラインで誰かにプログラムの添削を受けたり,複数人でコードをシェアするには,最善の環境であろう.
- 参考ページ
- Google Colab の一般的な話 google Colab
- ショートカットの方法 Colaboratoryショートカット備忘録
インストール方法
google のアカウントを持っているのが前提であるが,実は今は初期設定で google Colab は登録されていない(2020.4.11現在).そのため,自分で登録作業を一旦する必要がある.
の「2.Google Colabratory(アプリ)の追加」にしたがって,アプリを追加しよう.
追加したら,google drive から Google Colabratory を選択できるようになる.
作業ファイルの作成方法
作業ファイルを作るには,google drive で,右クリックをして,「その他」を選んで,
「Google Colaboratory」を選択しよう.google drive は一番上の階層が,「マイドライブ」であり,ここでは,その下に,「python関係」というディレクトリを作成し,さらにその下に,「202004」というフォルダを作成し,この下に作業ファイルを置くことにした.
宇宙天文の研究では,ファイルが100個から1000個,一万個など,膨大な数になるので,フォルダやディレクトリの階層を意識して,情報が混在しないように,何年後に見ても,どこで作業したかがわかるように手配しておこう.
動作環境(Ubuntu)の確認と使い方
OSの確認
python が動く環境,というのは一体何なのか,どういうマシンなのかを確認しよう.
そのために,まずは次のようなコマンドを打ってみよう.
なにやら Ubuntu ("うぶんつぅ"と発音)という文字がでてきた.
Ubuntu とは,linux の OS の中で最もポピュラーなモノです.linux の OS は最近は2種類に統一されてきて,一つがUbuntuで,もう一つ,少し玄人向けなのがCentOSです.どちらもほとんど同じですが,インストールのコマンドなどが少し違います(OSのバージョン依存もある).宇宙天文のデータ管理やサーバーなどはほとんどが linux ですので,linux の基礎 は勉強しておきましょう.また,このようにOSとそのバージョンを調べるのは最初が一歩です.ここでは,OSはUbuntuで,そのバーションは18.04.3になります.OSのバージョンによっても問題の解決方法が違うので,かならずチェックしましょう.
ここで,cat というコマンドは,テキストファイルと出力するコマンドになります.cat /etc/issue で,/etc/issue というテキストファイルを出力しているだけです.最初の ! は,Google Colab だけで必要なおまじないで,macのターミナルやlinuxでは不要になります.
データ容量の確認
さて,次に,動作する場所のディスク容量があるかを確認しましょう.もし,自分の作業スペースの容量がゼロであったら,ファイルが書き込めません.
そのためのコマンドが df というディスクの空き容量や,マウント場所などを教えてくれます.例えば一番上の 108G というのは,108GB(ギガバイド)の意味です.ただ,一杯でてきて,どれが自分が使えるものかわからないですね.
そこで,今自分がどこにいるかを確認しましょう.それには,pwd という自分の今の作業場所を教えてくれるコマンドを使います.
そうすると,/content というのが出来てきました.これが今の自分の場所で,df コマンドの Mounted on には /content がないので,一番上の / が自分のいる場所になります.Filesystem は overlary という名前のようで,これは 108GBのディスクのサイズがあって,そのうち,31GBは使用済みで,72GBが使用可,という意味です.
宇宙天文では,10TB程度の重いデータを扱うことも多いので,ディクス容量が足りるかのチェックが必要になります.ここでは詳しくは述べませんが,ファイルシステムの マウント というのは大事な概念なので時間があるときに理解しておいてください.
python のバージョンの確認
さて,そろそろ本題の python について調べてみよう.まずは,python のバージョンを確認しよう.
コマンドは,python --version でOKだ.ここでは,python の version は 3.6.9 のようだ.さて,次にこの python は一体どこに実体があるのだろうか??それは which というコマンドで調べられる.
これでわかった,python は,/usr/local/bin/python を呼び出しているのだ.
環境変数の確認
では次に環境変数(PATH)を確認しよう.ここでは,echo という中身や変数を書き出すコマンドをつかおう.
これが環境変数(PATH)の今の設定である.このPATHに書かれた場所にある実行ファイルは,どの作業ディレクトリにいようと,そのコマンドを叩けば,PATHに書かれたディレクトリの順にこのコマンド名を探してくれるのだ.環境変数は宇宙天文では必ずといってよいほど,設定のミスでハマることがあるので,PATHを通すために環境変数の設定を理解する (Mac OS X)などを一読ください.
新しいライブラリのインストール方法
linux マシンに新しいライブラリをインストール方法を確認しておこう.Ubuntuの場合は,apt-get install インストールしたいアプリ名,でインストールができる.試しに,screenfetch というOS情報をプリントアウトするモジュールで試してみよう.
google colab の注意点は,ここでインストールしたものは,12時間(?)くらいで消えてしまうことだ.
シェルの使い方
シェルの確認
自分の使っているシェル(SHELL)が何か確認しよう.コマンドは,echo という標準出力をするコマンドを使おう.
これで,/bin/bash と表示されたら,今はbashを使う設定になっている.
%%bash と打つことで,!のおまじない無しで,シェルのコマンドが使えるようになる.
whoamiというコマンドは,自分のアカウント名を取得するコマンドで,自分の名前が"root"だとわかる.
bash の for loop の使い方
bash の for loop の使い方を練習しよう.まず行で for loop を使ってみよう.
これで,i が 1,2,3,4 と走破し,do の中では $i としてアクセスする.これだけであるが,宇宙天体解析では,数100を超えるようなファイルの移動やコピーや前処理など日常茶飯事なので,使えるようになっておこう.
awk を用いた数値計算
宇宙天文では,数値計算を多用する,ここでは,awk を使って,足し算,引き算,掛け算,割り算,をやる方法を紹介したい.
ここで,"|" は「パイプ」と呼ばれるもので,パイプラインの略語として使われる.「パイプ」は,ある処理の結果を次々と渡すことができる仕組みである.この例では,echo というコマンドで,1.5 と 10.0 という2つの数字を次のプロセスに渡して,awk というコマンドは,それを引き取り,それぞれ $1, $2 という名前で処理が実行される.
awk には一通りの数値演算ライブラリが入っていて,例えば次のように,sin と書くだけで計算してくれる.
これらは google Colab に限らず,linux や Mac のターミナルでも全く同じ動作をする.
awk を用いたブラックホールスピンと最終安定軌道の計算方法 (おまけ)
さて,段々これは宇宙天文の研究なのか?と思った人もいるだろう.そこで,ブラックホールのスピンと最終安定軌道(ブラックホール周囲で有限の質量をもつ物質が安定に周回できる最小の距離のこと)の計算を awk で計算する例を示そう.
式は,Bardeen et al. (1972) の式 (2.21) ,
に導出も含めて記載がある.(簡単な日本語の教科書もある.)
%%bash
for a in `seq 0 0.1 1`
do
mass=10 #10 solar
Rin=`echo $a $mass | awk '{ if ($1>=0.0 && $1<=1) printf("%5.10f", 1.5 * $2 * (3 + (sqrt( 3*$1*$1 + ( (1+exp(log(( 1-($1)*($1)))/3) * (exp(log(( 1+($1) ))/3) + exp(log(( 1-($1)))/3))) ) * ( (1+exp(log(( 1-($1)*($1)))/3) * (exp(log(( 1+($1) ))/3) + exp(log(( 1-($1)))/3))) ) )) - sqrt(( 3- (1+exp(log(( 1-($1)*($1)))/3) * (exp(log(( 1+($1) ))/3) + exp(log(( 1-($1)))/3))) )* ( 3+ (1+exp(log(( 1-($1)*($1)))/3) * (exp(log(( 1+($1) ))/3) + exp(log(( 1-($1)))/3))) + 2 * (sqrt( 3*$1*$1 + ( (1+exp(log(( 1-($1)*($1)))/3) * (exp(log(( 1+($1) ))/3) + exp(log(( 1-($1)))/3))) ) * ( (1+exp(log(( 1-($1)*($1)))/3) * (exp(log(( 1+($1) ))/3) + exp(log(( 1-($1)))/3))) ) ))) ))) ; else print "negative"}' `
echo Mass = $mass : a = $a : Rin = $Rin
done
とすると、次の出力が得られる.
seqは数字列を作るコマンドで,ここでは for ループの中の数字を生成するのに使っている.
Mass = 10 : a = 0.0 : Rin = 90.0000000000
Mass = 10 : a = 0.1 : Rin = 85.0395385681
Mass = 10 : a = 0.2 : Rin = 79.9416494465
Mass = 10 : a = 0.3 : Rin = 74.6792524586
Mass = 10 : a = 0.4 : Rin = 69.2150305585
Mass = 10 : a = 0.5 : Rin = 63.4950379430
Mass = 10 : a = 0.6 : Rin = 57.4360412822
Mass = 10 : a = 0.7 : Rin = 50.8969270527
Mass = 10 : a = 0.8 : Rin = 43.5996578170
Mass = 10 : a = 0.9 : Rin = 34.8132456264
Mass = 10 : a = 1.0 : Rin = 15.0000000000
これは,太陽の10倍の質量のブラックホールについて,規格化されたブラックホールの角運動量を0から1.0まで動かしたときの,最終安定軌道 Rin (km) である.ブラックホールのシュワルツシルト半径(Rs)は Rs = 3km x (Mbh/Msolar) なので,10倍の太陽質量の場合は,30kmがシュワルツシルト半径となる.ブラックホールのスピンが0の場合は,最終安定軌道はシュワルツシルト半径の3倍であるため,90kmとなる.ブラックホールのスピンが1の場合(最大回転ブラックホール)は,その1/6倍のため,15kmとなる.
実際,こういう汚いawkの書き方はオススメしないので,pythonなどで計算した方がよいが,一応,簡単な演算であればawkでもできる例として紹介しました.
python の使い方
モジュールの確認
python の モジュールの一覧は、pip を使っている場合は pip list
というコマンドで取得できる. (anaconda を使っている場合は、conda list
です。) どちらも、list というオプションをつけるだけです。
以下,膨大なモジュールの数が出力されたであろう.このようにして,python はモジュールを組み合わせて変幻自在なコードへと進化する.そして,モジュール間のバージョンの整合性も自動で管理してくれる.
google colab は pip で python 管理されているが、anaconda 環境にしたい場合もあります。そういう場合は、
の xraylib の例のように、condacolab
を使えばよいです。モジュールによっては condacolab
が必要な場合が少なからずあります。
google drive のマウント
python を動かすだけであれば不要だが,生成したファイルやデータを保存したい場合は,google drive をマウントし,その場所にファイルやデータを置く必要がある.
やり方の詳細は GoogleDriveとColaboratory間のデータ操作まとめ を参照してほしい.Go to this URL に示された場所に飛んで,「許可」をするとパスワードがもらえるのでそれをコピペする.そうすると,/content/gdrive/My\ Drive/ 以下に自分の google drive が見える.ここに保存したデータや生成したファイルは消えることはない.ただし,間違えて消すこともできるので注意しよう.
簡単な図の描画と保存方法
では,まずは簡単な図を書いて,それをファイルに保存する練習をしよう.
を実行しよう. python のコードは,正規分布を生成して,ヒストグラムを作り,pngファイルに保存する、ものです。
なぜ、png 形式を選択したかというと、pdf や eps はベクター形式と呼ばれるもので再加工することができますが、宇宙天文ではデータ点が多いので要所(論文投稿用など)のみにつかう。pngはラスター形式というもので,ピクセス数だけでデータ量がきまるので,再加工などは向かないが,ちょこっとした図を作るときには重宝する.「ラスタ形式」と「ベクタ形式」って何?という方は,画像オブジェクトの「ラスタ形式」と「ベクタ形式」 違いと使い分けについてなどを一読ください.
import matplotlib.pyplot as plt
import numpy as np
x = np.random.normal(6400, 10, 1000) # 平均50、分散20の乱数を1000個作成する
fig = plt.figure() # プロットの場所の設定
plt.hist(x, bins=100) # ヒストグラムの描画
plt.title("normal histogram") # グラフの指定
plt.xlabel("x") # x軸のラベル
plt.ylabel("y") # y軸のラベル
plt.xlim(6350, 6450) # x軸範囲
plt.grid() # グリッド表示
#outdir="/content/gdrive/My Drive/python関係/202004/" #出力先
fig.savefig("test.png") # グラフの保存する
こうすると,test.png というファイルが,google drive に保存されている.
これを確認しよう.
google drive の表示が変更されるまでに,少しタイムラグがあるので,ちょっとだけ待とう.ファイルが生成された時刻を確認して,自分の意図した図ができていることを確認しよう.
変数の型について
変数には型というのがある.次を見てみよう.
3+7=10という計算をしている.これは,普通に 3 + 7 と書くだけである.
これを,"3" + "7" と書くと,文字の結合を解釈されて,"37"になる.
"3" * 7 とすると,"3" という文字が7個分ということで,"3333333"となる."3" * "7" は定義されないので,TypeError が発生する. なぜでしょうか?? (結果は言語に依存します。)
なぜこのような挙動をするのかを確認するには,type()という関数で,変数を挟むとよい.
このように,3 は 整数型(int)となり,3.1 は 浮動小数型(float)となり,"3" は文字型(string)となる.
文字列を数値にキャストしたい場合は,float()という関数で,文字列を変換すればよい.
これで,aは"10.01"という文字列であり,b=float(a)することで,文字列からfloat型に変換(キャスト cast と呼ぶ)される.
キャストには、このように明記する場合と,暗黙的型変換とよばれる暗黙のうちに型変換される場合がある.いずれも,宇宙天文のように計算間違いがクリティカルになる場合は,キャストにより有効数字が落ちることがないように注意した方がよい.
python は「動的型付け言語」と呼ばれ,型は後でも自由に変えられる特性を持つ.C言語などは,定義を宣言する時に,int, float などは厳密に宣言することがルールで,後から型変換は許されない厳しい言語である.
pythonの方が自由度が高い分,予期せぬ型変換や変数が代入されても気がつきにくいことがあるので,type()を使って型をチェックする習慣はつけておこう.例えば,
を一度は読んでおこう.
エラーの見方
python では,エラーの起こった箇所と行数を教えてくれる機能や,ipython の pdb という機能のように,エラーが起こった時に変数の中を調べることができる機能がある.traceback という機能で,これの読み方を知らないと,エラーが何で,どう対処してよいのかわからない.
を目を通してほしい.基本的に最後に出力された情報がエラーのおこった場所で,上はそれを呼び出している上流である.エラーが出たら,エラー名の確認,行数を確認,エラー箇所の特定を行い,わからない場合は,エラー部分を再実行して再現性の確認をする.
google Colab の場合は,%pdb on とすると,デバッグモードになる.例えば,次のような例を試してみよう.
ここで,エラーが起こった場所で,プログラムがストップするだけではなくて,ipdb> というデバックモードになり,エラーが起きた時点での変数の中身を追うことができる.2つだけコマンドを知っておいたほうがよい."u" (up) で上の階層に移動し,"d" (down) で下の階層に移動できる.深い階層の場合は,これを利用して問題箇所を特定する.ipython でも同じ機能がある.
練習問題
機械学習の練習
MNISTのもっとも簡単な例
MNISTというもっとも簡単な例を、google colab で動かしてみよう。
google Colab で機械学習をやる場合は、90分以内に一度ページをアクセスする必要と、12時間でセッションが切れることと、「使用上限に達したため」と言われて1日くらい待つ必要があること、の3つの制約がある。90分問題は、web上に山ほど回避方法があるが、使用上限を回避する方法はない。そのため、モデルと学習履歴をこまめにファイルに書き出すことを必ず入れたほうがよい。
それを考慮したMNISTのサンプルを作成しました。MNIST を google Colabで動かす例 を参考してください(2021.4.26更新)。
宇宙天文の解析
時間変動解析
宇宙天体のおいては,天体の明るさや,観測装置の性能など,すべてのものが時間変化するため,時間変動解析はどの分野や波長であっても重要となる.その中でも,フーリエ変換は基本となるので,その扱いから慣れてみよう.
そのまえに,もし,標準偏差や移動平均を知らない人は,
を一読ください.running average はデータの高周波成分を落とすための最も基本的な手法です.
フーリエ変換の基本的な方法については,
にまとめた.例としてブラックホールのX線強度変動を題材とした.
パワースペクトルの絶対値も実は有用な意味がある.パワースペクトルの縦軸とは,時系列データの変動の大きさと一対一対応するもので,これを使えると解析レベルが一つあがる.ただ,規格化はちょっと癖があるので,確認したい人は,
を一読ください.
次に,時系列データを生成する最も有名な方法を学んでおこう.それは,パワースペクトルの形を仮定して,位相はランダムとして生成する方法で,
にソースコードも含めておいてある.ブラックホールの限らずとてもよく使われる一般的な方法なので,習得すると応用が効くだろう.
python で、極値あるいはピークを自動検出する方法については、
を参考にしてください。
イメージ解析
に fits を astroquery でダウンロードして,銀河の画像をプロットする例があります.
統計処理
統計的な処理はいろんな重要な方法があるが,物理学を学んだ人にとっては,主成分分析を学んでおくとよい.
がとてもよくまとまっていますし,最もと言って良いほど基本的な解析手法なので,ぜひ習得しておこう.実は物理をやっている人はもうすでにそのエッセンスを学んでいる.量子力学で固有エネルギーや固有ベクトルを出すことと同じ操作です.解釈が統計的になるだけです.
まとめ
このように、google colab を使うだけで、宇宙の研究の基本について楽しく遊びながら学べますので、コンピュータが苦手という人もまずは気楽にやってみてください。誰かの始めるきっかけになれば幸いです。