modal
Pythonコードをサーバーレスコンテナ・GPU・オートスケーリング対応のクラウド環境で実行します。MLモデルのデプロイ、バッチ処理ジョブの実行、負荷の高いタスクのスケジューリング、GPUアクセラレーションや動的スケーリングが必要なAPIの提供に活用できます。
description の原文を見る
Run Python code in the cloud with serverless containers, GPUs, and autoscaling. Use when deploying ML models, running batch processing jobs, scheduling compute-intensive tasks, or serving APIs that require GPU acceleration or dynamic scaling.
SKILL.md 本文
Modal
概要
Modal はクラウドで Python コードを実行するためのサーバーレスプラットフォームで、最小限の設定で利用できます。強力な GPU 上で関数を実行し、数千のコンテナに自動スケーリングでき、使用した計算量に対してのみ課金されます。
Modal は特に AI/ML ワークロード、高性能なバッチ処理、スケジュール済みジョブ、GPU 推論、サーバーレス API に適しています。https://modal.com で無料サインアップして、毎月 $30 のクレジットを取得できます。
このスキルを使用するタイミング
以下の場合に Modal を使用してください:
- ML モデルのデプロイと提供 (LLM、画像生成、埋め込みモデル)
- GPU アクセラレーション計算の実行 (トレーニング、推論、レンダリング)
- 大規模データセットのバッチ処理を並列で実行
- 計算集約的なジョブのスケジューリング (日次データ処理、モデルトレーニング)
- 自動スケーリングが必要なサーバーレス API の構築
- 分散計算または専門的なハードウェアが必要な科学計算
認証とセットアップ
Modal は API トークンによる認証が必要です。
初期セットアップ
# Modal をインストール
uv pip install modal
# 認証 (ブラウザでログイン画面が開きます)
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
# Python パッケージを含む基本イメージ
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()
関数の呼び出し:
# ローカルエントリーポイントから
@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 アクセラレーション処理のコード
利用可能な GPU タイプ:
T4,L4- コスト効率の良い推論A10,A100,A100-80GB- 標準的なトレーニング/推論L40S- 優れたコスト/パフォーマンスバランス (48GB)H100,H200- 高性能トレーニングB200- フラッグシップパフォーマンス (最も強力)
複数の GPU をリクエスト:
@app.function(gpu="H100:8") # 8個の H100 GPU
def train_large_model():
pass
詳細は references/gpu.md の GPU 選択ガイダンス、CUDA セットアップ、マルチ GPU 構成を参照してください。
4. リソースを構成
関数に CPU コア、メモリ、ディスクをリクエストします。
@app.function(
cpu=8.0, # 8 個の物理コア
memory=32768, # 32 GiB RAM
ephemeral_disk=10240 # 10 GiB ディスク
)
def memory_intensive_task():
pass
デフォルト割り当て: 0.125 CPU コア、128 MiB メモリ。課金は予約または実際の使用量のいずれか高い方に基づきます。
詳細は references/resources.md のリソース制限と課金情報を参照してください。
5. 自動的にスケール
Modal は需要に基づいて関数をゼロから数千のコンテナまで自動スケーリングします。
入力を並列で処理:
@app.function()
def analyze_sample(sample_id: int):
# 単一サンプルを処理
return result
@app.local_entrypoint()
def main():
sample_ids = range(1000)
# 自動的にコンテナ間で並列化
results = list(analyze_sample.map(sample_ids))
オートスケーリングを構成:
@app.function(
max_containers=100, # 上限
min_containers=2, # ウォーム状態を維持
buffer_containers=5 # バースト用のアイドルバッファ
)
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() # 変更を永続化
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"]
# トークンを認証に使用
Modal ダッシュボードまたは CLI 経由でシークレットを作成:
modal secret create my-secret KEY=value API_TOKEN=xyz
詳細は references/secrets.md のシークレット管理と認証パターンを参照してください。
8. Web エンドポイントをデプロイ
@modal.web_endpoint() を使用して HTTP エンドポイント、API、ウェブフックを提供します。
@app.function()
@modal.web_endpoint(method="POST")
def predict(data: dict):
# リクエストを処理
result = model.predict(data["input"])
return {"prediction": result}
以下でデプロイ:
modal deploy script.py
Modal はエンドポイント用の HTTPS URL を提供します。
詳細は references/web-endpoints.md の FastAPI 統合、ストリーミング、認証、WebSocket サポートを参照してください。
9. ジョブをスケジュール
cron 式を使用してスケジュールで関数を実行します。
@app.function(schedule=modal.Cron("0 2 * * *")) # 毎日午前 2 時
def daily_backup():
# データをバックアップ
pass
@app.function(schedule=modal.Period(hours=4)) # 4 時間ごと
def refresh_cache():
# キャッシュを更新
pass
スケジュール済み関数は手動呼び出しなしで自動的に実行されます。
詳細は references/scheduled-jobs.md の cron 構文、タイムゾーン構成、監視を参照してください。
一般的なワークフロー
ML モデルを推論用にデプロイ
import modal
# 依存関係を定義
image = modal.Image.debian_slim().uv_pip_install("torch", "transformers")
app = modal.App("llm-inference", image=image)
# ビルド時にモデルをダウンロード
@app.function()
def download_model():
from transformers import AutoModel
AutoModel.from_pretrained("bert-base-uncased")
# モデルを提供
@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)
# データを処理
return df.shape[0]
@app.local_entrypoint()
def main():
files = ["file1.csv", "file2.csv", ...] # 数千のファイル
# 自動的にコンテナ間で並列化
for count in process_file.map(files):
print(f"Processed {count} rows")
GPU でモデルをトレーニング
@app.function(
gpu="A100:2", # 2 個の A100 GPU
timeout=3600 # 1 時間のタイムアウト
)
def train_model(config: dict):
import torch
# マルチ GPU トレーニングコード
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、ウェブフック、エンドポイント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 コミュニティに参加してください。
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- davila7
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/davila7/claude-code-templates / ライセンス: MIT
関連スキル
doubt-driven-development
重要な判断はすべて、本番環境への展開前に新しい視点から対抗的レビューを実施します。速度より正確性が重要な場合、不慣れなコードを扱う場合、本番環境・セキュリティに関わるロジック・取り消し不可の操作など影響度が高い場合、または後でバグを修正するよりも今検証する方が効率的な場合に活用してください。
apprun-skills
TypeScriptを使用したAppRunアプリケーションのMVU設計に関する総合的なガイダンスが得られます。コンポーネントパターン、イベントハンドリング、状態管理(非同期ジェネレータを含む)、パラメータと保護機能を備えたルーティング・ナビゲーション、vistestを使用したテストに対応しています。AppRunコンポーネントの設計・レビュー、ルートの配線、状態フローの管理、AppRunテストの作成時に活用してください。
desloppify
コードベースのヘルスチェックと技術負債の追跡ツールです。コード品質、技術負債、デッドコード、大規模ファイル、ゴッドクラス、重複関数、コードスメル、命名規則の問題、インポートサイクル、結合度の問題についてユーザーが質問した場合に使用してください。また、ヘルススコアの確認、次の改善項目の提案、クリーンアップ計画の作成をリクエストされた際にも対応します。29言語に対応しています。
debugging-and-error-recovery
テストが失敗したり、ビルドが壊れたり、動作が期待と異なったり、予期しないエラーが発生したりした場合に、体系的な根本原因デバッグをガイドします。推測ではなく、根本原因を見つけて修正するための体系的なアプローチが必要な場合に使用してください。
test-driven-development
テスト駆動開発により実装を進めます。ロジックの実装、バグの修正、動作の変更など、あらゆる場面で活用できます。コードが正常に動作することを証明する必要がある場合、バグ報告を受けた場合、既存機能を修正する予定がある場合に使用してください。
incremental-implementation
変更を段階的に実施します。複数のファイルに影響する機能や変更を実装する場合に使用してください。大量のコードを一度に書こうとしている場合や、タスクが一度では完結できないほど大きい場合に活用します。