はじめに
のんびりブログを書いているうちにだいぶ前のことになってしまいましたが、 JAWS-UG HPC #7 に行ってきました。そこで紹介されたSaaS型HPC Rescale が面白そうだったので、チュートリアルをやってみました。最近私は、オープンソースの流体解析ライブラリである OpenFOAM で 遊んでみたり しているので、今回も Rescale公式のOpenFOAMのチュートリアル をやってみました。このチュートリアルの日本語で書かれた解説としては こちらのQiitaの記事 が参考になります。
チュートリアルやってみた
アカウント作成
まずはアカウントを作成します。 Rescaleにアクセス すると、以下のような場面が表示されるはずです。右上の Free Trial をクリックします。 するといろいろ入力項目が出てきますが、必須項目は
- メールアドレス
- パスワード
- 氏名
のみです。適宜セキュアなパスワードを設定して、Sign Up & Start Free Trial をクリックします。
すると画面が表示され、入力したメールアドレスにすぐに案内が届きます。
新規アカウントを登録すると、2000円分のクーポンがついてきます。このクーポンは有効期限がないので、クラウドサービスを使い始めたときにありがちな「全く使わないうちに無料枠の期限が切れてしまった」という問題は起きません。迷わずアカウントを作ってしまいましょう。
チュートリアルの内容
手順通りに作業するだけだと楽しくないので、このチュートリアルがどんなシミュレーションをしているのかについて説明しておきます。
このチュートリアルでは、翼に対していろいろな角度・風速で風を当てたときの空気の流れをシミュレーションしています。翼の周りに流れができると、翼を浮き上がらせようとする力(揚力)や押し流そうとする力(抗力)が働きます。流れのシミュレーションができると、これらの力がどれくらいの大きさになるのかも計算することができます。このチュートリアルでは最終的に「風が当たる角度や風速が変わった時に、揚力や抗力がどう変化するか」を調べています。それをグラフとして出力しているので、「翼の周りの流れがどうなっているか」というカッコイイ図は明示的には出て来ないのですが、裏側ではちゃんと翼の周りの流れを計算しています。
この説明を読むと、専門家の皆様はいろいろ指摘したくなるはずですが、マサカリはご容赦ください。
ファイルの準備
チュートリアル を始める前に、必要な3つのファイルをダウンロードしておく必要があります。まずは、ログイン後のトップ画面に表示されている Aerodynamics のリンクをクリックします。 すると、既にチュートリアルの内容で設定済みのジョブの画面が表示されます。これをそのまま実行してもシミュレーションを動かせるはずですが、それだとあっけなさすぎるので、この設定済みジョブから必要なファイルを取得します。まずは Input をクリックし、airfoil2d.zip というファイルをダウンロードします。 このzipファイルには、シミュレーションをする上で必要になる設定ファイルが保存されています。例えば、翼がどんな形をしているのかといった情報や、空間をどれくらい細かく表現するか、時間変化をどれくらい細かく計算するかといったシミュレーションの設定ファイルが含まれています。ほぼ同じファイルが手に入るGitHubのリポジトリ もあるので、こちらから取得してもシミュレーションできるかもしれません。 次に Templates をクリックし、U.inp_template をダウンロードします。これが2つめのファイルとなります。 このファイルは、OpenFOAMの境界条件ファイルのフォーマットにあわせて書かれています。境界条件とはこのチュートリアルの場合、「流れをシミュレーションする領域に、どう風が吹き込んでくるか」という条件になります。この条件のもと、吹き込んできた風がシミュレーションの領域内でどう流れるかを計算することになります。U.inp_templateでは、境界条件の設定の一部が$つきで変数として表記されています。ここにRescaleが自動的にいろいろな数値を入れることにより、シミュレーション内で翼にあたる風の角度と風速が変わります。 最後にPost Processingをクリックし、extract.pyというファイルをダウンロードします。 extract.pyは、OpenFOAMによって書き出される計算結果から、揚力と抗力を抜き出してくるスクリプトです。
ジョブの設定
必要なファイルをダウンロードできたら、ジョブの設定に移ります。ログイン後トップ画面の左上 New Job をクリックします。 するとジョブの設定画面に遷移します。まずは以下の2つを設定します。
- ジョブのタイトル欄(Untitled Jobと記載されている欄)をクリックしてジョブに名前をつけます
- Job TypeとしてDOEを選択します
DOEとは Design of Experiments(実験計画法)の略です。実験やシミュレーションで複数のパラメータを変化させる場合、すべてのパラメータの組み合わせ条件でしらみつぶし的に実験(またはシミュレーション)することがあります。このチュートリアルでは、風の角度と風速を、 x_velocity (翼に対して水平な速度成分)と y_velocity (翼に対して垂直な速度成分)の2つのパラメータで表現しています。x_velocity は11段階、y_velocity は4段階変化させ、44条件すべてをしらみつぶし的にシミュレーションします。
このように、パラメータを変化させながら全ての条件でシミュレーションしたいとき、RescaleではJob TypeをDOEに設定します。私の妄想では、Job Type の Basic はパラメータを変化させない一発物のシミュレーション、Optimizationはしらみつぶし的ではなくうまいことシミュレーション数を減らしたいときに使うものということになっています。またこの画面では Input 用のファイルを設定します。Upload from this computer をクリックし、先ほど入手した airfoil2d.zip をアップロードします。
次にDOEの設定である Parallel Settings を行います。先ほど説明した x_velocity と y_velocity の設定をします。チュートリアルの内容に合わせて以下のように設定します。
x_velocity | y_velocity | |
---|---|---|
Min Value | 20 | 3 |
Max Value | 30 | 6 |
Increment | 1 | 1 |
続いてTemplatesをクリックして、DOEで変化させるパラメータを設定します。まずUpload from this computerから、先ほど入手したU.inp.templateをアップロードします。すると "Processed File Name" を入力できるようになるので、スクショの通り "airFoil2D/0/U" を入力します。OpenFOAMでは、速度の境界条件ファイルはこのパスに保存することになっています。Rescaleで自動的に境界条件のファイルの一部を書き換え、この指定したパスに保存してくれます。
次はSoftwareの設定になります。Rescaleでは120以上のソフトウェアを利用できます。今回はOpenFOAMを利用するので、そのように設定します。検索窓に "OpenFOAM" と入力して絞り込むのが便利です。
ソフトウェアとしてOpenFOAMを選択すると、実行するコマンドを設定できるようになります。OpenFOAMのチュートリアルでは、実行すべきコマンドをまとめたシェルスクリプトがAllrunというファイル名で用意されているので、これを指定すればOKです。
次に計算を実行するハードウェアを選択します。Onyx, Nickel, Titaniumというスペックの異なる3つのサーバから選択できます。OnyxはCPUがIntel Xeon E5-2666 v3 (Haswell)ということで、裏側はこれかなぁという気がしてくるので、私はOnyxを選びました。本家のチュートリアルではNickelを選択しています。1種類のサーバに対し、Instant, Low Priority, Prepaidという3段階の価格が設定されています。Instantならすぐ実行、Low Priorityだと低価格だが結果が返ってくるまでどれくらい時間がかかるかは保証されない、Prepaidはその名の通り前払いのようです(参考)。これらはそれぞれ、AWSのオンデマンドインスタンス、スポットインスタンス、リザーブドインスタンスが裏側で稼働していると想像できます。科学計算にはスポットインスタンスを使うイメージがあるので、ここではLow Priorityを使ってみます。画面下部にてNumber of Cores per Slotなどを設定すれば、クラスタで計算を並列化させて計算時間を短くすることができます。私は本家チュートリアル通りに単一のサーバで計算しました。
最後にPost Processing(後処理)の設定をします。先ほど説明した通り、シミュレーション結果のファイルから、スクリプトを使って揚力と抗力を抜き出してきます。先ほど取得したスクリプトファイル(extract.py)を"Upload from this computer"からアップロードし、これを実行するコマンドを "Post-processing command" の欄に入力します。コマンド中 Cd は抗力係数、Cl は揚力係数を意味しています。これらは、揚力や抗力を様々な実験条件・計算条件において比較しやすくするため、無次元の係数としたものです。
これでセットアップは完了です。"Submit"をクリックして計算を開始させてください。
計算してみる
計算中は、シミュレーションの進捗状況や途中の計算結果を表示させることができます。画面右側のタブで表示を切替されます。そのうち "Status" "Results" "Charts" の3つを紹介します
Status
Statusタブでは、計算の進捗状況を確認することができます。画面上部には、進捗がバーの形式で表示されており、入力内容の検証、クラスターの準備、ジョブの実行、クラスターの停止の各動作にそれぞれどれくらいの時間がかかっているか一目瞭然です。画面中部や下部では、シミュレーション結果が記録される各ファイルの更新状況や、ログの主要なメッセージを確認できます。
Results
Resultsタブでは、各条件での計算結果を数値データで確認できます。今回は 11×4 = 44 通りの条件で計算を行っています。よって、画面右上も歯車マークをクリックし Show 50 に設定しておけば十分全条件を表示できます。それぞれの条件について計算の開始時刻や終了時刻、および計算結果から抜き出された抗力係数(Cd)、揚力係数(Cl)が表示されます。
Charts
Chartsタブでは、抗力係数(Cd)と揚力係数(Cl)をグラフ形式で表示させることができます。グラフの形式として "Scatter" "Area" "Surface" の3種類を選択できますが、今回の計算結果を表示するには "Scatter" か "Surface" が良さそうです。"Scatter"では、例えば横軸(X Axis)にx_velocity, 縦軸(Y Axis)にCdとClを設定すると「翼に対して水平な風がどんどん強くなった時に、抗力と揚力がどう変化するか」を調べることができます。
Scatter で描けるグラフは2次元ですが、Surface では3次元のグラフを描くことができます。例えば X軸をx_velocity, Y軸をy_velocity, Z軸をCdにすると、Scatterでは表現できなかったy_velocity(翼に垂直な風の強さ)の変化の影響も見ることができます。
Z軸をClにするとこんな感じになります。
感想
Rescaleを使ってみた感想を書いておきます。
手間がかからない
SaaSであるため、物理層の管理、サーバのネットワーク設定、OS設定、ソフトウェアのインストールなどが不要です。設定項目は、CAE利用者が設定する必要のある、シミュレーションの条件設定などに限られています。
円建ての支払いに対応している
利用料が円建てで決まっているため、利用者が為替変動のリスクを負わずに済みます
スポットインスタンスを使いやすい
AWSを使ってスポットインスタンスを含むHPCクラスタを構築する場合、強制終了となった時の対策をとる必要があります。Rescaleでは、そのあたりの対策も講じられているようなので、気軽にスポットインスタンス相当のLow priorityを選択できます。
AWSなどのクラウドと、OpenFOAMなどの自由に使えるCAEは相性がよいと思います。今回、これらをまるっと合わせて使えるSaaSであるRescaleを試してみて、だれでも気軽に大規模シミュレーションができる時代の到来を感じました。APIも提供されているとのことなので、他のSaaSとの連携も試してみたいところです。