🦀

無料でRustのJupyterLab機械学習環境を作る in AWS

2021/12/23に公開

この記事はRust Advent Calendar 2021の23日目の記事です。

Rustで機械学習をやってみたいという方は少数派かもしれません。PythonやRの環境が圧倒的過ぎて他の追随を許さないからです。しかしそれがタダで手に入るとなったらいかがでしょうか? ブラウザだけでどこでも利用できるRustの機械学習環境をクラウド上に持てるのであれば試す価値があるかもしれません。本記事ではAmazon SageMaker Studio Labを利用して、無料でRustの機械学習環境を作る方法にチャレンジします。

はじめに

本記事ではAmazon SageMaker Studio Labを利用して、Rustの機械学習環境を構築する試みを紹介します。無料のJupyterLab環境をRustで利用しようという狙いです。

https://aws.amazon.com/jp/blogs/news/now-in-preview-amazon-sagemaker-studio-lab-a-free-service-to-learn-and-experiment-with-ml/

単にJupyter Notebookの環境が欲しいだけならVisual Studio Codeでも対応していますし、GoogleのColaboratoryというサービスもあります。しかし高機能で拡張可能なJupyterLabの最新の3系バージョンを試せるとなると話が違ってきます。しかもGPUインスタンスも選択できるという太っ腹です。最強のNotebook環境を無料でクラウド上に維持できるのなら試してみない手はありません。

Amazon SageMaker Studio LabはPythonやRで機械学習の定番環境を構築するのは簡単なのですが、RustをJupyterLabで利用できるようにするのには苦戦しました。それはsudoRootアカウントが利用できないからです。本記事ではその辺りを乗り越えつつ、Rustで利用できる機械学習クレートを紹介していきます。

Amazon SageMaker Studio Labとは

Amazon SageMaker Studio LabAWS re:Invent 2021で発表された、無料で利用できる機械学習環境です[1]。メールアドレス一つで簡単に利用登録できるオンラインの機械学習環境であり、クレジットカードの登録もいりません。 具体的な利用条件や環境は以下のとおりです。

  • 利用について
    • クレジットカードの登録はいらない
    • AWSのアカウントもいらない
    • 必要なのはメールアドレスのみ
  • 利用対象者
    • データサイエンティスト、エンジニア、科学者、教師、学生
  • 利用目的
    • Jupyterノートブックを使用したディープラーニングの学習または実験
      • 言語の制限はないのでRustも問題なし!
    • 本番タスクには使用してはならない
      • 会社での利用でもディープラーニングの学習や実験のためであれば問題ないが、業務用の本番環境としての利用は駄目だということだと思われる
  • インスタンスについて
    • CPUインスタンス・GPUインスタンスが選択できる
    • CPUインスタンス
      • 1セッションで12時間の利用が可能
      • T3.xlargeインスタンス
    • GPUインスタンス
      • 1セッションで4時間の利用が可能
      • G4dn.xlargeインスタンス
    • インスタンスはx86_64のAmazonLinuxベース
  • セッションで利用可能な時間が過ぎると自動でインスタンスが終了する
    • 1回終了しても手動ですぐに再開可能
    • 残りの利用時間は起動ページに表示されている
    • インスタンスを一旦手動でストップして、再開すれば残りの利用時間はリセットされる
  • 環境のカスタマイズ
    • pipcondaが利用可能
    • gitが利用可能
    • sudo,aptは利用できない
    • JupyterLab や Jupyter Server拡張をインストール可能
  • メモリ・ストレージ
    • 15GBの永続ストレージ16GBのRAM
  • 暗号通貨をマイニングできますか?
    • 禁止です。違反したら垢BANされます。

さらに詳しく知りたい方は以下のFAQもご確認ください。

https://studiolab.sagemaker.aws/faq

Amazon SageMaker Studio Labの利用方法

まずはAmazon SageMaker Studio Labのアカウントを取得します。以下のページのRequest free accountボタンを押してください。

https://studiolab.sagemaker.aws

以下のような入力フォームが出ますが、必須はEメールアドレスだけです。入力完了したらSubmit requestボタンを押してアカウントの要求を行います。

しばらくするとEメールアドレスの確認メールが飛んできます。メールのVeryfy emailボタンで確認を行うと、「Account request confirmed」というタイトルのメールが飛んできて、アカウント要求が受け付けられます。ここから作成されるまでには1〜5営業日かかります。私の場合は翌日に利用可能になりました。「Your account is ready」というタイトルのメールが来るのでサインインを行って利用が開始できます。サインイン後の画面は以下のとおりです。CPUインスタンスかGPUインスタンスを選択して、Start Runtimeを押すことでインスタンスが開始します。

しばらくするとランタイムが利用可能になるのでOpen Projectを押すと別タブでJupyterLabの画面を開くことができます。「Getting Started.ipynb」というノートブックには利用方法が書いてあります。(hinastoryというディレクトリは私が作成したものです)

JupyterLabでRustを利用可能にする

ここからがこの記事の本番です。赤枠で囲った+ボタンをクリックするとLancherタブが開きますが、デフォルトではdefault:Pythonと書かれたPython環境だけが利用可能なことが分かります。目的はここにRust環境を表示させることです。

Rustのインストール

まずはLancherからTerminalボタンをクリックし、ターミナルを立ち上げます。

Rustのインストールは以下で可能です。

$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

さらに以下を実行することで現行のシェルにPATHを通すことができます。

$ source $HOME/.cargo/env

evcxr_jupyterのインストール

RustをJupyterLabから利用可能にするためにはevcxr_jupyterのインストールが必要です。

https://github.com/google/evcxr/blob/main/evcxr_jupyter/README.md

ただここで一つ問題が起こります。インストールにcmakeが必要でこれをaptでインストールせよとあります。しかしSageMaker Studio Labの環境ではsudoもRootアカウントも使えないので別の方法でインストールする必要があります。

幸いにもcondacmakeがあったのでcondacmakeをインストールした後にevcxr_jupyterをインストールします。

$ conda install cmake
$ rustup component add rust-src
$ cargo install evcxr_jupyter
$ evcxr_jupyter --install

さて、ここまですればJupyterLabのランチャーにRustのボタンが現れてくれるはずでしたが、残念ながら表示はされませんでした。

RustカーネルがJupyterLabで利用できない原因を色々調べる

とりあえずjupyter kernelspec listで表示してみるとRustカーネルは認識されているみたいですが、なぜかJupyterLabからは表示されないし、カーネルも選択できない状態でした。

(studiolab) studio-lab-user@default:~$ jupyter kernelspec list
[ListKernelSpecs] WARNING | Config option `kernel_spec_manager_class` not recognized by `ListKernelSpecs`.
Available kernels:
  rust       /home/studio-lab-user/.local/share/jupyter/kernels/rust
  python3    /home/studio-lab-user/.conda/envs/studiolab/share/jupyter/kernels/python3
(studiolab) studio-lab-user@default:~$ 

よくよく調べてみるとcondaで環境を作成してipykernelcondaでインストールすればJupyterLabに認識させられるとのことだったので、とりあえずそこに突破口がありそうでした。

最終的にうまくいった方法

大分苦戦しましたが以下がうまく行った方法です。

$ conda create -n <my-rust-env>
$ mkdir -p ~/.conda/envs/<my-rust-env>/share/jupyter/kernels
$ cp -rf ~/.local/share/jupyter/kernels/rust  ~/.conda/envs/<my-rust-env>/share/jupyter/kernels
$ ln -s ~/.cargo/bin ~/.conda/envs/<my-rust-env>/bin

まずはcondaで新しい環境を作成し、Rustカーネルをその環境下にコピーします。ただこれだけだとJupyterLabにRust環境のbinへのパスが通らないので無理やりシンボリックリンクを貼りました。ここまでの作業を実施しランチャーを開くとRustの環境が追加されていることが分かります。(ランチャーに表示されるまでには1分程かかりました)

とりあえずこれで動きましたが、注意点としてはシンボリックリンクでbinを無理やり書き換えているのでこの環境にアクティベートしてconda installすると~/.cargo/bin配下にcondaのバイナリがインストールされてしまうことです。

もっとスマートなやり方があるとは思っていますが、とりあえず今回はこれでRustの機械学習環境の構築を完了とします。

Rustで使える機械学習関連のクレート紹介

ここからはRustで利用可能な機械学習関連のクレートをノートブックの実行結果で紹介していきたいと思います。

ベクトル、行列を扱う - ndarray

まずはndarrayクレートを使ってベクトル、行列を表示してみます。ndarrayはPythonでいうnumpy相当です。以下がノートブックの実行結果です。見て頂くと大体どんな雰囲気で利用できるかご理解頂けるとおもいます。

いくつか補足しますと:depevcxr_jupyterの組み込みのコマンドでRustのクレートをcargoコマンドでインストールすることなしにノートブックで利用できます。この機能は超絶便利で他のノートブックに干渉しないのも魅力です。しかし毎回クレートのビルドが走るのでクレートによっては超絶重いのは覚悟してください。

あとshowataというクレートも利用していますがこれはndarrayの出力をJupyterLabできれいに出力するためのものです。

データフレームを扱う - polars

次はpolarsクレートを用いてデータフレームを利用してみたいと思います。polarsはPythonのpandas相当です。pandasを利用したことがある方であれば以下の実行結果はなんとなくわかるのではないかと思います。

表がアスキーアートなのがイケていませんがevcxr_jupyterではカスタム出力ができるので、簡単にHTMLで表示するようにできそうです。

グラフを扱う - plotters

データフレームの次は定番のグラフ描画に行きたいと思います。Rustではグラフ描画のクレートはいくつかあるのですがここではplottersクレートを利用します。plottersはPythonのMatplotlib相当です。以下はplottersのサンプルを実行したものです。

ここまででRustの機械学習関連のクレートの紹介はおしまいです。本当はもっと色々試すつもりだったのですが今回は時間がなかったのでまた次の機会に記事にしてみたいと思います。

おまけ

Rustで機械学習の記事としては中途半端になってしまったお詫びにRustをJupyterLabで利用するにあたって超絶に便利な機能を3つほどご紹介します。

:dep

最初はすでにご紹介した:depです。ノートブックの途中で好きなクレートを読み込むことができます。この機能は非常に便利ですが、裏ではライブラリのダウンロードとビルドが走るので激重です。Jupyterカーネルを再起動するとダウンロードとビルドがまた走るのでキャッシュみたいなことはしていないようです。

:dep showata = { version = "0.3.2", features=["show_ndarray"]}
:dep ndarray = "0.14"

:vars

:varsは現在利用している変数を表示してくれます。型も表示してくれるので非常に重宝します。

ちなみにJupyterLab 3.0から標準搭載されたビジュアルデバッガは非常に便利で変数表示はもちろんブレークポイントコールスタック表示もできるのですが、Rustでは現状ビジュアルデバッガは使えません。Pythonを使うときにはぜひお試しください。

:timing

:timingはセルの実行時間を実行結果とともに表示してくれます。ちょっと時間を計測したいときには便利に使えます。トグル式なので一回実行するとその後のセルも実行時間が表示されます。もう一度:timingを実行するとオフにできます。

まとめ

本記事ではAWS re:Invent 2021で発表されたAmazon SageMaker Studio Labを利用して無料でRustの機械学習環境を手に入れる方法を紹介しました。またRustの機械学習関連のクレートであるndarray(numpy相当)、polars(pandas相当)、plotters(matplotlib相当)を紹介し、ノートブックの実行結果をお見せしました。おまけとしてはJupyterLabでRustを利用するときに死ぬほど便利な:dep:vars:timingもご紹介しました。この記事で紹介したノートブックはGitHubに上げたので興味がある方はご覧ください。

https://github.com/hinastory/rust_ml_notebook_sample/blob/main/rust_ml_base.ipynb

本当はTensorflowのRustバインディングも試してGPUインスタンスの性能チェックまで行ってみたかったのですが、意外とRustをAmazon SageMaker Studio Labで利用するまでに時間を使いすぎてしまったため、タイムアップとなってしまいました。機会があればそちらの方も継続してチャレンジして記事にしてみたいと思います。

最後になりましたがAmazon SageMaker Studio Labは本当に素晴らしい環境です。Rust環境の作成には多少苦労しましたが、PythonやRの機械学習環境としては申し分ないと思います。まだプレビュー版ですが、JupyterLab 3.0でカスタマイズ性も高くGPUを無料で自由に触れる砂場としては最高の環境なので、これからがっつり遊び倒していきたいと思います。

本記事がAmazon SageMaker Studio LabやRustで機械学習に興味がある方の一助になれば幸いです。

脚注
  1. Amazon SageMaker Studio Lab はAWS re:Invent 2021で発表されましたが、正確にはAWSのアカウントなしで使えるのでAWSのサービスではありません。しかし既存のAWSのサービスであるSageMakerとの関連も深く、 「AWS re:Invent」 で発表されたということもあり、タイトルには 「in AWS」 と付けさせて頂きました。 ↩︎

Discussion