mcpField
A
alterlab-modal

alterlab-modal

github.com/alterlab-ieuクラウド・DevOps7866 回インストール5 週間前に更新
リポジトリ

alterlab-modal について

alterlab-modalは、ModalのサーバーレスクラウドでPython関数を実行するためのスキルです。AI/ML開発者や研究者向けに、GPU計算、並列ジョブ、定期実行、APIデプロイを案内します。

主な機能

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

活用シーン

  1. 01MLモデルの推論サービス
  2. 02大規模データセットの並列処理
  3. 03GPUを使ったモデル学習
  4. 04定期的な計算ジョブの実行

インストール

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

$npx skills add https://github.com/alterlab-ieu/alterlab-academic-skills --skill alterlab-modal

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

同梱ファイル

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

evals/
evals.json
references/
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 の構築
  • 分散コンピューティングや特殊なハードウェアが必要な科学計算
該当しない場合
シナリオ代わりに使用
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 世代のワークステーション向け GPU
  • B200、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 - イメージのビルド、依存関係、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 コミュニティに参加してください。

AlterLab Academic Skills スイートの一部です。

コメント