mcpField
M
modal

modal

github.com/davila7クラウド・DevOps33.0k884 回インストール1 日前に更新
リポジトリ

modal について

Pythonをクラウドで実行するサーバーレスプラットフォーム、Modalの利用ガイドです。関数、コンテナ、GPU、ストレージ、自動スケーリングの設定や、APIと定期ジョブのデプロイ方法を扱います。

主な機能

  1. 01クラウド上のPython関数の定義
  2. 02コンテナイメージと依存関係の設定
  3. 03GPUと計算リソースの指定
  4. 04自動スケーリングと並列処理
  5. 05データの永続化とシークレット管理
  6. 06エンドポイントと定期ジョブのデプロイ

活用シーン

  1. 01機械学習モデルの推論をデプロイ
  2. 02大規模データセットの並列処理
  3. 03GPUを使った学習ジョブの実行
  4. 04自動スケーリングするAPIの構築
  5. 05定期的な計算タスクのスケジュール

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/davila7/claude-code-templates --skill modal

インストール後、Claude Code で/modalを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
api_reference.md
examples.md
functions.md
getting-started.md
gpu.md
images.md
resources.md
scaling.md
scheduled-jobs.md
secrets.md
volumes.md
web-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 - イメージのビルド、依存関係、Dockerfile
  • references/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 - 科学計算における一般的なパターン

ベストプラクティス

  1. 再現可能なビルドのために、.uv_pip_install() で依存関係のバージョンを固定する
  2. 適切な GPU の種類を使用する - 推論には L40S、学習には H100/A100
  3. キャッシュを活用する - モデルの重みやデータセットには Volumes を使用する
  4. オートスケーリングを構成する - ワークロードに応じて max_containers と min_containers を設定する
  5. ローカルで利用できないパッケージは、関数の本体内でインポートする
  6. 逐次的なループの代わりに .map() を使用して並列処理する
  7. シークレットを安全に保存する - API キーをハードコードしない
  8. コストを監視する - 使用量と請求内容は 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 コミュニティに参加してください。

コメント