並列計算ラボ:GPU を使わずに GPU の考え方を JupyterLab で
このラボは、生徒ひとりひとりに専用の JupyterLab を用意し、GPU の土台になっている考え方を学べるようにします。たくさんの数に対する1回の操作、ワーカーで分けた仕事、それでどこまで速くなるかの限界、各自が自分の要素を見つけるスレッドのブロックの起動、そしてデータを動かすコストです。ラボに GPU はありません。 NumPy、Python 標準の multiprocessing、6つの短いスクリプトで、その考え方を教えます。
攻撃のラボではありません。どのコピーも、インターネットにも、ほかの生徒にもつながっていないので、何かをダウンロードすることも、ほかの誰かに届くこともありません。
生徒が学ぶこと
NumPy の1回の操作が、配列全体に対する Python のループと同じ仕事をすること。1から1000までの2乗の合計はどちらの方法でも 333833500 で、Python の操作はループが2000回、NumPy が1回です。仕事を、かたまりに切って2つのワーカーで分けられること、そして部分和を足すと同じ合計になること。どんな仕事にも分けられない部分があり、直列が10%ならワーカー8個で4.71倍、何個にしても10.0倍を超えないこと。GPU のカーネルがスレッドのブロックとして起動され、各スレッドが「ブロック番号×ブロックの大きさ+スレッド番号」で自分の要素を求める様子を、ふつうの Python で再現して見ること。バイトを動かすことと計算をすることのどちらで仕事が限られるかを、決めた帯域と速度から求めること。そして、隣り合う数を読むスレッドはメモリの1ラインを取ってくるのに、とびとびに読むスレッドは8ライン取ってくること。コンピュータアーキテクチャ、並列計算・高性能計算、グラフィックスの入門に向いています。正確な表現はご自分の認定機関の単元で確かめてください。ここには引用していません。
ブラウザーで動かす
ラボはサービスをひとつ、jupyter だけ起動します。作業フォルダーにノートブックと6つのスクリプトを書き出し、数秒で使えるようになります。サービスに許される512 MB の範囲に収まります。JupyterLab はトークンを求めません。プラットフォームの入り口が開く人をすでに知っているからです。ラボの横のターミナルには Python がないので、docker exec jupyter に続けて、中で実行するコマンドを入力して、ラボの Python を使います。時間は測らないので、どのスクリプトも毎回同じものを表示します。
- コンテナーのページを開く. バーの「つくる」を開き、「コンテナーを実行」を選びます。ページは誰でも開けて、Git ラボと SQL ラボはアカウントなしで起動できます。ほかのラボには無料アカウントが必要です。アカウントを作成してサインインし、「起動」を押します。
- ラボを探す. 「サンプルラボ」のカードにすべてのサンプルが並んでいます。JupyterLab:GPU なしの並列計算を探します。
- 「起動」を押す. 「起動」はそのまま1回の操作で実行します。「先にファイルを編集」は compose ファイルを開くので、起動する前に変更できます。
- 開く. ラボのページにあるラボバーの「JupyterLab」のリンクを押すと、ブラウザーで JupyterLab が開くので、start.ipynb をダブルクリックします。次に「ターミナルを開く」を押して、docker exec jupyter python3 steps/vectors.py と入力すると、2つの結果がどちらも 333833500 で等しく、操作の回数がループは2000回、NumPy は1回と表示されます。
生徒に提出させるもの
スクリプトのひとつに自分で加えた短い変更を、JupyterLab の File、Download でダウンロードして提出させます。たとえば chunks.py のかたまりの数、amdahl.py の分けられない割合、kernel.py の起動の大きさを変えます。そして、何がどう動いたかを自分の言葉で一、二文で書かせます。自動採点はありません。その文で、理解できたかがわかります。もう少し高いレベルを求めるなら、実行する前に新しい数を予想させ、本物の GPU で先にぶつかる限界は、直列の部分とメモリのどちらかを言わせてください。
このラボの基本レッスン
Parallel Computing Basics は、このラボで進める小さなレッスンです。生徒は、スクリプトを一覧し、2乗の合計をループと NumPy の1回の操作で求め、ひとつの合計を2つのワーカーで分け、高速化率の表を読み、スレッドのブロックの起動を再現して、2つの仕事のうちメモリで限られるのはどちらかを確かめ、そのあと同じ作業を最初のノートブックで開きます。
わざと小さくしてあります。ラボで進めるレッスンとはどんなものかを先生に見せ、残りはラボが受け持ちます。変更したいときは、ご自分のモジュールにコピーしてください。
GitHub のコード
compose ファイルには Dockerfile がありません。動かすのは、Jupyter Docker Stacks 自身の公開イメージ scipy-notebook ひとつで、日付つきのタグに固定し、権限のない専用アカウントとメモリ512 MB で実行します。イメージのライセンスは BSD-3-Clause で、私たちは配布していません。ファイルは起動時に決まった数からスクリプトを書き出すので、どのコピーも同じものを表示し、何もダウンロードしません。限界は正直に言います。GPU はないので、カーネルの起動は Python で再現したもので、データの移動の数字は架空の装置についての算数であり、測定ではありません。インターネットから何かをインストールすることはできません。ラボを止めると何も残らないので、生徒は先に自分の作業をダウンロードします。
課題として出す
何を提出するかを、課題の中に書いてください。
- ラボを作る. モジュールで課題を追加し、「コンテナーラボ」のカードを選んでから「GitHub リポジトリ」を選びます。https://github.com/mitsurutech/lab-parallel-lab とブランチ main を指定します。compose ファイルは既定の compose.yaml です。変更したい場合は、たとえばスクリプトが使う数を変えるときは、先にリポジトリをフォークしてください。
- 公開して試す. 「公開」すると、確認したコミットに固定されるので、あとでリポジトリを変更しても、すでに出したラボは変わりません。まず自分のコピーを起動してください。
- 配布する. ほかの課題と同じように配布します。期限を付けることもでき、課題には何をするか、何を提出するかを書いておきます。
- 提出物を採点する. 生徒のコピーを開いて提出された内容を確認し、採点します。足りない場合は理由を書いて差し戻します。
このラボを試す、そして費用
無料の個人アカウントで、このラボの基本レッスンに取り組めます。毎月、ほとんどのレッスンに足りる無料クレジットがあり、カードは要りません。クラスで使う場合、学校は最初の365日間、生徒50人まで無料で、その後は生徒1人あたりの年額です。すべてのラボが含まれ、教職員は無料です。
よくある質問
- ラボに GPU はありますか。
- ありません。このラボは、GPU の土台になっている考え方を、NumPy、Python の multiprocessing、短いスクリプトで教えます。カーネルの起動はふつうの Python で再現し、データの移動の数字は架空の装置についての算数なので、生徒は GPU がなくてもGPU の考え方を身につけられます。
- ターミナルで docker exec jupyter を使うのはなぜですか。
- ラボのターミナルには curl、psql などのクライアントはありますが、Python はありません。docker exec jupyter は、ラボのコンテナの中でコマンドを実行します。そのコンテナには Python と NumPy があります。JupyterLab にも専用のターミナルがあり、File、New、Terminal から開けます。
- どのスクリプトも時間を表示しないのはなぜですか。
- 時間は実行のたびにも、マシンによっても変わるので、レッスンは生徒に何が見えるはずかを言えなくなります。スクリプトは代わりに操作の回数を数え、決めた帯域と速度から数字を求めます。そのため、実行するたびに同じものが表示され、どの答えも手計算で確かめられます。