そぬばこ

備忘録とか、多分そんな感じ。

学内教育系サーバsol, cedにPython 3.xを管理者権限無しで入れて、Jupyter Notebookを手元のブラウザで使えるようにするまで

この記事は、UEC Advent Calendar 2018 - Adventar 17日目の記事です。前日はid:takadanobabauecさんの「カモノハシの支離滅裂な文」でした。

さて、なんやかんやでUEC Advent Calendarも3年目です。まともな記事を一つも書いた記憶がないので、少しはまともな記事を書けるようにやっていきたいと思います。ただ、今年はNimに関する記事が多い中恐縮ですが、Pythonの環境構築の話をしていきます。

経緯

私は、情報工学工房という授業の1テーマである「データ解析と機械学習」に参加しています。このテーマは経営科学系研究部会連合協議会主催のデータ解析コンペティションに出場し、やっていきを出しながらやっていく感じです(わからん)*1。学内の教育系サーバであるsolにコンペ使用するデータを置いてもらったはいいものの、基本的に外部持ち出しが禁じられているので、sol or ced*2で作業せんといけんのう、となりました。

pipのインストール先でも変えてやればなんとでもなるんかなと思っていましたが、solで python3 を叩くと

$ python3 -V
python3: Command not found.

そもそも入ってへんやんけ。といった調子です。一応2系は入ってますよ。めでたいですね。

$ python -V
Python 2.7.5

solには期待しね―わ。とか思っていると、我らがcedには入っていました。めでたい。

$ python3 -V
Python 3.4.5

おっ、まあ3.4.5やと3.5から使えるようになったnumpyの@が使えへんくらいしか困らんし、なんとかなるやんけ。

ところが

$ pip -V
pip 18.0 from /usr/lib/python2.7/site-packages/pip (python 2.7)
$ pip3 -V
/usr/bin/pip3: Command not found.

くぅぅ。面倒くさいのう……。

前置きが長くなりましたが、そんなこんなあり、自分とこのホームの下にpython3の環境作ったほうが早いんちゃう?ということで、やりました。

Linuxbrew を入れる

python3をソースからビルドするんちゃうんかい。と思った方がいるでしょう。solだと問題なかったらしいのですが、cedで試しにビルドしたところ、pipがうまくいかず*3、パッケージ管理システム的なそれを使うほうがええんちゃう?となりました。

別にHomebrewを常に使っているわけではありませんが*4、その時はなんとなく、これを採用したわけです。

念の為、プロキシは通しておきます。.cshrcにでも書いておくと良いでしょう。

$ setenv http_proxy http://proxy.uec.ac.jp:8080
$ setenv https_proxy http://proxy.uec.ac.jp:8080
$ setenv ftp_proxy http://proxy.uec.ac.jp:8080
$ setenv HTTP_PROXY http://proxy.uec.ac.jp:8080
$ setenv HTTPS_PROXY http://proxy.uec.ac.jp:8080
$ setenv FTP_PROXY http://proxy.uec.ac.jp:8080

git cloneでLinuxbrewを入れていきます。好きなところに入れればいいと思いますが、私は$HOME/local/にぶち込んでいます。入れたい場所に事前にディレクトリを作っておきましょう。

$ cd ~/local/
$ git clone https://github.com/Linuxbrew/brew.git

入ったらbrewにPATHを通すのと、cacheの指定をしておきます。.cshrcにでも書いておいてください。

setenv HOMEBREW_CACHE $HOME/local/brew/cache
setenv PATH $HOME/local/brew/bin:${PATH}
setenv LD_LIBRARY_PATH $HOME/local/brew/lib:${LD_LIBRARY_PATH}

ほんでsource ~/.cshrcしときましょう。 特に私の抜けがなれけば、これで任意のパッケージをインストール出来るようになっているはずです。

python3を入れる

brewが使えればこっちのものなので、python3を入れていきます。

$ brew install python3

いつもの🍺が出れば、とりあえずお疲れ様でした。という感じです。

$ python3 -V
Python 3.7.1
$ pip3 -V
pip 18.1 from ...

ced(sol)で入れたbrewのパッケージをsol(ced)でも使えるようにするには?

sol(ced)のほうでもPATHを通せばいいだけです。

cedのホームはsolのホームにある.ced_centosなので、それを考慮してPATHを通してください。

Jupyter Notebookを手元のPCのブラウザで使えるようにする

学外からssh出来る関係上、ここではsolでやることを前提にお話します。

前提としてまずはsol(ced)にIPythonとJupyterを入れましょう。

$ pip3 install ipython jupyter

そうしましたら、後で使うSHA鍵を生成します。passwd()後に任意のパスワードを入力してください。

$ ipython
In [1]: from IPython.lib import passwd
In [2]: passwd()

SHA鍵が生成されたら、次はJupyter Notebookの準備です。~/.jupyter/jupyter_notebook_config.pyを作り、以下のような内容を書いておきます。{生成されたSHA鍵}の部分は先程生成されたSHA鍵に置き換えてください。

c = get_config()

# plot
c.IPKernelApp.pylab = "inline"
# IP
c.NontebookApp.ip = "*"
# password
c.NotebookApp.password = 'sha1:{生成されたSHA鍵}'
# browser
c.NotebookApp.open_browser = False
# port number
c.NorebookApp.port = 8888

ここでのc.NorebookApp.port = 8888は後で行うSSHトンネルで使うポート番号にしておきます。今回は8888にしました。

設定は以上です。そうしましたら、手元のPCからSSHトンネルを使ってsolにアクセスします。<username>は自分のものに置き換えてください。

$ ssh -L 8888:localhost:8888 <username>@sol.edu.cc.uec.ac.jp -Y

そして、Jupyter Notebookを起動します。

$ jupyter notebook

これでsshしている手元のPCのブラウザからhttp://localhost:8888にアクセスし、passwd()の時に入れた任意のパスワードを入力すれば、solで動かしているJupyter Notebookが無事使えるようになります。

もちろんのことですが、先に誰かが8888を使っている場合は、別のところにJupyter Notebookが立つので、注意してください。

役に立つかどうかはわかりませんが、以上になります。たまにsolでの作業中にtopコマンドを叩くと一番上に自分のユーザー名が来ていたりして、情報基盤センターから怒られないかビクビクしながら作業をしています。皆さんも学内の計算機資源を使って(あくまでも教育的目的に限りますが)、プログラムとかをガンガンぶん回していきましょう。

明日はshilfolさんです。

*1:情報工学工房について、詳しくは11日目の記事であるid:reflection4さんのACM-ICPC2018 アジア地区横浜大会 参加記 - りふれろぐを読むと幸せになれるでしょう。

*2:I類、I科の教育系サーバ

*3:OpenSSL周りのエラーで躓く。こっちもローカルビルドとかしてみたけどダメ。ココらへん詳しくなくて解決できなかった。

*4:そもそもMacをメインで使ったことがない