alterlab-modal について
alterlab-modalは、ModalのサーバーレスクラウドでPython関数を実行するためのスキルです。AI/ML開発者や研究者向けに、GPU計算、並列ジョブ、定期実行、APIデプロイを案内します。
主な機能
- 01クラウドPython関数の定義
- 02コンテナイメージと依存関係の構築
- 03GPUと計算リソースの指定
- 04並列ワークロードの自動スケーリング
- 05Volumesによるデータ永続化
- 06エンドポイントと定期ジョブのデプロイ
活用シーン
- 01MLモデルの推論サービス
- 02大規模データセットの並列処理
- 03GPUを使ったモデル学習
- 04定期的な計算ジョブの実行
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ alterlab-ieu/ alterlab-academic-skills --skill alterlab-modalインストール後、Claude Code で/alterlab-modalを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
evals/evals.jsonreferences/examples.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 の構築
- 分散コンピューティングや特殊なハードウェアが必要な科学計算
該当しない場合
| シナリオ | 代わりに使用 |
|---|---|
| SLURM/HPC、RunPod、GCP Batch へのプロバイダー非依存のジョブディスパッチ(送信 → ポーリング → 回収) | alterlab-remote-compute |
| ローカルでの PyTorch トレーニング構成、マルチ GPU 戦略、チェックポイント処理 — サーバーレスデプロイは不要 | alterlab-pytorch-lightning |
| Latch プラットフォームでのバイオインフォマティクスのワークフロー | alterlab-latchbio |
| DNAnexus でのゲノミクスアプリ/アプレット | alterlab-dnanexus |
認証とセットアップ
Modal の認証には API トークンが必要です。
初期セットアップ
# Install Modal (SDK 1.x; current 1.5.x as of 2026-09)
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.8.1-devel-ubuntu24.04", add_python="3.12")(完全なタグを使用してください。NVIDIA はタグが省略された12.x.y-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- 高性能なトレーニング(H100!は H100 を固定します。通常のH100は同じ価格で H200 にアップグレードされる場合があります)RTX-PRO-6000- Blackwell 世代のワークステーション向け GPUB200、B300- 最上位の Blackwell(B200+は 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
デフォルトの割り当て:CPU コア 0.125 個、メモリ 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.fastapi_endpoint() を使用して、HTTP エンドポイント、API、Webhook を提供します。
@app.function()
@modal.fastapi_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
MODEL_ID = "distilbert/distilbert-base-uncased-finetuned-sst-2-english"
def download_model():
from transformers import pipeline
pipeline("text-classification", model=MODEL_ID) # fills the HF cache
# Define dependencies; run_function executes once at image build, so the weights
# are baked into the image instead of downloaded on every cold start
image = (
modal.Image.debian_slim()
.uv_pip_install("torch", "transformers")
.run_function(download_model)
)
app = modal.App("llm-inference", image=image)
# Serve model
@app.cls(gpu="L40S")
class Model:
@modal.enter()
def load_model(self):
from transformers import pipeline
self.pipe = pipeline("text-classification", model=MODEL_ID, 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 コミュニティに参加してください。
AlterLab Academic Skills スイートの一部です。