格安・簡単にCPU, GPUリソースを使えると噂のModalを触ってみる

# はじめに
巷で話題の画像生成を自分の手元で実行したいけどGPUリソースがなくてあきらめている..
GPUリソースをクラウドで使いたいけど、クラウドの設定難しそうだし、高い、もっと簡単に安く使いたい...
そんな人(私自身)でも格安・簡単にGPUリソース(CPUも)使えるModalを触ってみようと思います。

:::note
2023/03/05現在、modalはプライベートベータ版でサインアップすることでベータテストの招待が受けられます。
:::


# Modalってなに?
<div align="center"><img width=500 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2650703/ebde9010-2fb7-ff06-ccc8-8df5b095bf6d.png"></div>

> Your end-to-end stack for cloud compute
Modal lets you run or deploy machine learning models, massively parallel compute jobs, task queues, web apps, and much more, without your own infrastructure.

> Cloud power, local productivity
Modal lets you run your code in the cloud within seconds. No need to install Docker, set up Kubernetes clusters, or even have an AWS account.

https://modal.com/

Python向けのクラウドコンピューティングサービスの一種で
並列処理やwebアプリ、機械学習モデルなどが自分たちで特別なインフラを用意しなくても実行・デプロイできます。

また、クラウドコンピューティングと書いてはいますが、AWSの登録や個別にDockerなどを準備する必要がなく、そのうえ自身のコードを数秒でクラウド上で実行できるため手軽にリソースを使いたい人にはもってこいのサービスです。

そして、クラウドと聞いて気になるのがお値段ですが、以下のようになっています。
安いですね!(当社比)　しかも、かかるのは使った時間だけなので、使い方によってはパパっと使ってお目当てのもののために使えば、すごく安く抑えられると思います。
<img width=500 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2650703/6a62b4a0-dcde-c837-e1a2-08afbac83504.png">

また、個人利用の場合毎月10$のクレジットがついてくるようなので、巷で噂の画像生成なら無料の範囲で何回も使えそうですね！
<img width=500 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2650703/a67bc178-d91c-b00f-fc7a-6a3098257906.png">

簡単に紹介しましたが、本当に使いやすいのかはこれだけではわからないと思うので使っていこうと思います。

# つかってみる
## 前準備
使うためにまずサインアップをします。サインアップはgithubのアカウントで行います。
サインアップが終わると、Tokenが発行されるようになるのですが実際に使用できるまでは１日ほど待たなければいけないようです。
Tokenの発行準備が整うとメールが届くのでそれまでのんびり待ちましょう。
## チュートリアル
Token発行準備完了後ログインすると以下のような画面に行けるようになります。
早速チュートリアルをやっていきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2650703/7add15a1-8a46-696d-01a4-7c52a4781e26.png)

### Download and configure the Python client
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2650703/63880787-d6bc-9658-0ec5-7f18dcd19062.png)
以下のコードを実行していきます。
```shell
pip install modal-client
modal token new
``` 
自分の環境では`modal token new`を実行するとURLが表示されたので開くとToken発行画面が開き無事Tokenを発行できました。
準備としてはたったこれだけで完了のようです。簡単ですね！

### Run some code
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2650703/6999118c-8ba1-1d33-de54-5f60d3705030.png)
こちらも指示通りに、やっていきます。

こちらのプログラムは42の2乗を行うスクリプトみたいです。
```py
import modal

stub = modal.Stub("example-get-started")


@stub.function
def square(x):
    print("This code is running on a remote worker!")
    return x**2


@stub.local_entrypoint
def main():
    print("the square is", square.call(42))

```
上記プログラムをファイルに書き出しておきましょう。


このプログラムで注目するべきは４か所です。
まずは`import modal`です。
これは、modalを使うためにパッケージをインポートしています。

次に`stub = modal.Stub("example-get-started")`です。
ここではmodalのリソースに名前を付けてmodalのクラウドリソースを使う準備を整えます。
[reference](https://modal.com/docs/reference/modal.Stub)を読んでみるともっと、詳しく書かれていますが、ここでは簡単に自身のコードが終わるまでに使うmodalのクラウド資源の確保のための処理としておきます。

次に`@stub.function`のデコレータです。
このデコレータが付与された関数はmodalのクラウドリソース上で実行されることとなります。

最後に`@stub.local_entrypoint`です。
これを付けたものが自分のローカル環境で初めに実行されるものとなります。

以上の４つを自身のコードに書き込めばローカルでクラウド資源を使用する準備は完了です。
簡単ですね！

では、最後に実行しましょう
```sh
modal run get_started.py
```
そうすると以下のようなログが出てきて実行がされます。
```sh
$ modal run get_started.py
✓ Initialized. View app at https://modal.com/apps/hogehoge
✓ Created objects.
├── 🔨 Created square.
└── 🔨 Created mount 
/hogehoge/get_started.py
This code is running on a remote worker!
the square is 1764
✓ App completed.
```

ちなみに、実行中にmodalにログインしてブラウザを見ていると紙吹雪が舞います。粋な？演出ですね！

ここまでが簡単に使用する方法みたいです。どうでしょうか？手軽に使えそうではないでしょうか?

## GPUも簡単に使えるのか
先ほどまでの例はCPUを利用している例でした。
では、GPUの場合はどうするのかですが、
modalでは、以下の例のようにGPUを使用する関数にデコレータ
`@stub.function`を付けたうえで、引数`gpu`に使用したいリソースの文字列を与えるだけで使えるようです。

```py
@stub.function(gpu="T4")
def my_t4_function():
    ...

@stub.function(gpu="A10G")
def my_a10g_function():
    ...
```

2023/03/05現在使用できるGPUは"T4", "A10G"の２種類です。これは Nvidia Tesla T4 or A10Gのことを指しており、
GPUの性能はそれに準じているようです。
そのほか使い方詳細は公式ガイドに乗っているので、気になる人は見てみてください。

https://modal.com/docs/guide/gpu


# 終わりに
本記事ではGPUを実際に使った様子を載せませんでしたが、
公式ガイドには、[Stable diffisionで画像を生成](https://modal.com/docs/guide/ex/stable_diffusion_cli)や[深層学習のモデル訓練](https://modal.com/docs/guide/ex/tensorflow_tutorial), [Blenderを使った3Dレンダリング](https://modal.com/docs/guide/ex/blender_video)など様々な例があるため、すごく丁寧で使い始めやすい印象を受けました。