modal について
Modalは、Pythonコードをクラウドで実行するサーバーレスプラットフォームです。ML開発者や柔軟な計算リソースを必要とするチーム向けに、GPU、自動スケーリング、永続ストレージ、定期ジョブ、Webエンドポイントを提供します。
主な機能
- 01クラウドコンテナでPython関数を実行
- 02GPU、CPU、メモリを設定
- 03需要に応じてコンテナを自動スケーリング
- 04Volumeによるデータの永続化
- 05HTTPS Webエンドポイントのデプロイ
- 06関数実行のスケジュール設定
活用シーン
- 01MLモデルの推論サービスをデプロイ
- 02大規模データセットを並列処理
- 03GPUを使ったモデル学習を実行
- 04データ処理ジョブを定期実行
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ leonchaox/ qinyan-academic-skills --skill modalインストール後、Claude Code で/modalを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/api_reference.mdexamples.mdfunctions.mdgetting-started.mdgpu.mdimages.mdresources.mdscaling.mdscheduled-jobs.mdsecrets.mdvolumes.mdweb-endpoints.md詳細
Modal
概要
Modal は、最小限の設定でクラウド上の Python コードを実行できるサーバーレスプラットフォームです。強力な GPU で関数を実行し、数千のコンテナまで自動的にスケールし、使用したコンピュートリソースの分だけ支払うことができます。
Modal は、AI/ML ワークロード、高性能バッチ処理、スケジュールジョブ、GPU 推論、サーバーレス API に特に適しています。https://modal.com で無料サインアップすると、毎月 $30 分のクレジットを受け取れます。
このスキルを使用するタイミング
次の目的で Modal を使用してください:
- ML モデル(LLM、画像生成、埋め込みモデル)のデプロイと提供
- GPU で高速化された計算の実行(トレーニング、推論、レンダリング)
- 大規模データセットの並列バッチ処理
- 計算負荷の高いジョブのスケジュール実行(日次データ処理、モデルトレーニング)
- 自動スケーリングが必要なサーバーレス API の構築
- 分散コンピュートや特殊なハードウェアを必要とする科学計算
認証とセットアップ
Modal は API トークンによる認証が必要です。
初期セットアップ
# Install Modal
uv uv pip install modal
# Authenticate (opens browser for login)
modal token new
これにより、~/.modal.toml にトークンが保存されます。このトークンがすべての Modal 操作の認証に使用されます。
セットアップの確認
import modal
app = modal.App("test-app")
@app.function()
def hello():
print("Modal is working!")
実行方法: modal run script.py
主要機能
Modal は、コンテナ内で実行される Functions を通じてサーバーレスの Python 実行を提供します。コンピュート要件、依存関係、スケーリングの動作を宣言的に定義できます。
1. コンテナイメージの定義
Modal Images を使用して、関数の依存関係と環境を指定します。
import modal
# Basic image with Python packages
image = (
modal.Image.debian_slim(python_version="3.12")
.uv_pip_install("torch", "transformers", "numpy")
)
app = modal.App("ml-app", image=image)
一般的なパターン:
- Python パッケージのインストール:
.uv_pip_install("pandas", "scikit-learn") - システムパッケージのインストール:
.apt_install("ffmpeg", "git") - 既存の Docker イメージの使用:
modal.Image.from_registry("nvidia/cuda:12.1.0-base") - ローカルコードの追加:
.add_local_python_source("my_module")
イメージ構築の詳細なドキュメントは references/images.md を参照してください。
2. 関数の作成
@app.function() デコレーターを使用して、クラウド上で実行される関数を定義します。
@app.function()
def process_data(file_path: str):
import pandas as pd
df = pd.read_csv(file_path)
return df.describe()
関数の呼び出し:
# From local entrypoint
@app.local_entrypoint()
def main():
result = process_data.remote("data.csv")
print(result)
実行方法: modal run script.py
関数のパターン、デプロイ、パラメータ処理については references/functions.md を参照してください。
3. GPU の要求
関数に GPU を割り当てて、計算を高速化します。
@app.function(gpu="H100")
def train_model():
import torch
assert torch.cuda.is_available()
# GPU-accelerated code here
利用可能な GPU の種類:
T4、L4- コストパフォーマンスに優れた推論向けA10、A100、A100-80GB- 標準的なトレーニングと推論向けL40S- コストパフォーマンスのバランスに優れる(48GB)H100、H200- 高性能トレーニング向けB200- 最上位の性能(最も強力)
複数の GPU を要求:
@app.function(gpu="H100:8") # 8x H100 GPUs
def train_large_model():
pass
GPU の選択ガイダンス、CUDA のセットアップ、マルチ GPU 構成については references/gpu.md を参照してください。
4. リソースの設定
関数に対して CPU コア、メモリ、ディスクを要求します。
@app.function(
cpu=8.0, # 8 physical cores
memory=32768, # 32 GiB RAM
ephemeral_disk=10240 # 10 GiB disk
)
def memory_intensive_task():
pass
デフォルトの割り当て: 0.125 CPU コア、128 MiB メモリ。課金は、予約量と実際の使用量のうち大きい方に基づきます。
リソースの上限と課金の詳細については references/resources.md を参照してください。
5. 自動スケーリング
Modal は、需要に応じて関数をゼロから数千のコンテナまで自動的にスケールします。
入力の並列処理:
@app.function()
def analyze_sample(sample_id: int):
# Process single sample
return result
@app.local_entrypoint()
def main():
sample_ids = range(1000)
# Automatically parallelized across containers
results = list(analyze_sample.map(sample_ids))
自動スケーリングの設定:
@app.function(
max_containers=100, # Upper limit
min_containers=2, # Keep warm
buffer_containers=5 # Idle buffer for bursts
)
def inference():
pass
自動スケーリングの設定、同時実行、スケーリングの上限については references/scaling.md を参照してください。
6. データの永続化
Volumes を使用すると、関数の呼び出しをまたいでデータを永続的に保存できます。
volume = modal.Volume.from_name("my-data", create_if_missing=True)
@app.function(volumes={"/data": volume})
def save_results(data):
with open("/data/results.txt", "w") as f:
f.write(data)
volume.commit() # Persist changes
Volumes は実行間でデータを保持し、モデルの重みを保存し、データセットをキャッシュし、関数間でデータを共有できます。
ボリュームの管理、コミット、キャッシュのパターンについては references/volumes.md を参照してください。
7. シークレットの管理
Modal Secrets を使用して、API キーや認証情報を安全に保存します。
@app.function(secrets=[modal.Secret.from_name("huggingface")])
def download_model():
import os
token = os.environ["HF_TOKEN"]
# Use token for authentication
Modal ダッシュボードまたは CLI でシークレットを作成:
modal secret create my-secret KEY=value API_TOKEN=xyz
シークレットの管理と認証パターンについては references/secrets.md を参照してください。
8. Web エンドポイントのデプロイ
@modal.web_endpoint() を使用して、HTTP エンドポイント、API、Webhook を提供します。
@app.function()
@modal.web_endpoint(method="POST")
def predict(data: dict):
# Process request
result = model.predict(data["input"])
return {"prediction": result}
デプロイ方法:
modal deploy script.py
Modal はエンドポイント用の HTTPS URL を提供します。
FastAPI との統合、ストリーミング、認証、WebSocket のサポートについては references/web-endpoints.md を参照してください。
9. ジョブのスケジュール設定
cron 式を使って、関数をスケジュールに従って実行します。
@app.function(schedule=modal.Cron("0 2 * * *")) # Daily at 2 AM
def daily_backup():
# Backup data
pass
@app.function(schedule=modal.Period(hours=4)) # Every 4 hours
def refresh_cache():
# Update cache
pass
スケジュールされた関数は、手動で呼び出さなくても自動的に実行されます。
cron の構文、タイムゾーンの設定、監視については references/scheduled-jobs.md を参照してください。
一般的なワークフロー
推論用に ML モデルをデプロイする
import modal
# Define dependencies
image = modal.Image.debian_slim().uv_pip_install("torch", "transformers")
app = modal.App("llm-inference", image=image)
# Download model at build time
@app.function()
def download_model():
from transformers import AutoModel
AutoModel.from_pretrained("bert-base-uncased")
# Serve model
@app.cls(gpu="L40S")
class Model:
@modal.enter()
def load_model(self):
from transformers import pipeline
self.pipe = pipeline("text-classification", device="cuda")
@modal.method()
def predict(self, text: str):
return self.pipe(text)
@app.local_entrypoint()
def main():
model = Model()
result = model.predict.remote("Modal is great!")
print(result)
大規模データセットをバッチ処理する
@app.function(cpu=2.0, memory=4096)
def process_file(file_path: str):
import pandas as pd
df = pd.read_csv(file_path)
# Process data
return df.shape[0]
@app.local_entrypoint()
def main():
files = ["file1.csv", "file2.csv", ...] # 1000s of files
# Automatically parallelized across containers
for count in process_file.map(files):
print(f"Processed {count} rows")
GPU でモデルを学習する
@app.function(
gpu="A100:2", # 2x A100 GPUs
timeout=3600 # 1 hour timeout
)
def train_model(config: dict):
import torch
# Multi-GPU training code
model = create_model(config)
train(model)
return metrics
リファレンスドキュメント
特定の機能に関する詳細なドキュメント:
references/getting-started.md- 認証、セットアップ、基本的な概念references/images.md- イメージのビルド、依存関係、Dockerfilereferences/functions.md- 関数のパターン、デプロイ、パラメーターreferences/gpu.md- GPU の種類、CUDA、マルチ GPU の構成references/resources.md- CPU、メモリ、ディスクの管理references/scaling.md- オートスケーリング、並列実行、同時実行数references/volumes.md- 永続ストレージ、データ管理references/secrets.md- 環境変数、認証references/web-endpoints.md- API、Webhook、エンドポイントreferences/scheduled-jobs.md- Cron ジョブ、定期タスクreferences/examples.md- 科学計算における一般的なパターン
ベストプラクティス
- 再現可能なビルドのために、
.uv_pip_install()で依存関係のバージョンを固定する - 適切な GPU の種類を使用する - 推論には L40S、学習には H100/A100
- キャッシュを活用する - モデルの重みやデータセットには Volumes を使用する
- オートスケーリングを構成する - ワークロードに応じて
max_containersとmin_containersを設定する - ローカルで利用できないパッケージは、関数の本体内でインポートする
- 逐次的なループの代わりに
.map()を使用して並列処理する - シークレットを安全に保存する - API キーをハードコードしない
- コストを監視する - 使用量と請求内容は Modal のダッシュボードで確認する
トラブルシューティング
「Module not found」エラー:
.uv_pip_install("package-name")を使用して、パッケージをイメージに追加する- ローカルで利用できないパッケージは、関数の本体内でインポートする
GPU が検出されない:
- GPU の指定を確認する:
@app.function(gpu="A100") - CUDA の利用可否を確認する:
torch.cuda.is_available()
関数のタイムアウト:
- タイムアウトを延長する:
@app.function(timeout=3600) - デフォルトのタイムアウトは 5 分です
Volume の変更が保持されない:
- ファイルを書き込んだ後に
volume.commit()を呼び出す - 関数のデコレーターで Volume が正しくマウントされているか確認する
さらにヘルプが必要な場合は、https://modal.com/docs の Modal ドキュメントを参照するか、Modal Slack コミュニティに参加してください。