esm-protein-language-model について
esm-protein-language-modelは、ESMの事前学習済みタンパク質モデルを設計と表現学習に使うスキルです。ESM3の生成・構造タスクと、下流の機械学習向けESM C埋め込みを扱います。
主な機能
- 01構造または機能を条件とした配列生成
- 02ESM Cによるタンパク質埋め込み抽出
- 03配列からの3D構造予測
- 04標的構造に合う配列の設計
- 05Forgeクラウド推論の利用
活用シーン
- 01タンパク質配列設計の探索
- 02埋め込みを用いたタンパク質分類
- 03アミノ酸配列からの構造予測
- 04標的フォールドに合う配列の生成
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ jaechang-hits/ sciagent-skills --skill esm-protein-language-modelインストール後、Claude Code で/esm-protein-language-modelを入力して読み込まれたか確認します。
詳細
ESM — タンパク質言語モデル
概要
ESM(Evolutionary Scale Modeling)は、タンパク質の生成設計と表現学習のための事前学習済みタンパク質言語モデルを提供します。ESM3 は、配列、構造、機能を同時に条件とするマルチモーダル生成モデルです。ESM C は、下流の ML タスク向けにタンパク質表現を抽出するために最適化された、高効率な埋め込みモデルです。
使用する場面
- 望ましい構造や機能を条件として、新しいタンパク質配列を生成する
- 分類、クラスタリング、回帰のために、タンパク質配列から固定長の埋め込みを抽出する
- アミノ酸配列から 3D 構造を予測する
- インバースフォールディング:標的構造に折りたたまれる配列を設計する
- 機能キーワード(GO 用語、EC 番号)でタンパク質に注釈を付ける
- 配列アラインメントの代わりに埋め込み距離を使って、タンパク質の類似性を比較する
- 思考の連鎖によるタンパク質設計:配列、構造、機能を反復的に改良する
- 従来の物理ベースの構造予測には、代わりに AlphaFold を使用してください
- 配列アラインメントと相同性検索には、代わりに BioPython 経由で BLAST/HMMER を使用してください
前提条件
- Python パッケージ:
esm(EvolutionaryScale パッケージ) - ハードウェア:ローカル推論では GPU を推奨します(ESM3:8 GB 以上の VRAM、ESM C:4 GB 以上の VRAM)。小規模なバッチであれば CPU でも動作します
- クラウドの代替手段:EvolutionaryScale Forge API(forge.evolutionaryscale.ai の API トークンが必要です)
- モデルの重み:初回使用時に自動でダウンロードされます(モデルにより約 1~4 GB)
pip install esm
# For Forge cloud API
pip install esm[forge]
クイックスタート
from esm.models.esmc import ESMC
from esm.sdk.api import ESMProtein
# Load ESM C model for embeddings
model = ESMC.from_pretrained("esmc_600m")
# Create protein from sequence
protein = ESMProtein(sequence="MKTAYIAKQRQISFVKSHFSRQLEERLGLIEVQAPILSRVGDGTQDNLSGAEKAVQVKVKALPDAQFEVVHSLAKWKRQQIAATGFHIIPGDKPDNRAGGYDN")
# Get per-residue embeddings
output = model(protein)
embeddings = output.embeddings # shape: (1, seq_len, embedding_dim)
print(f"Embedding shape: {embeddings.shape}")
# Embedding shape: (1, 101, 1152)
コア API
1. タンパク質配列の生成(ESM3)
構造、機能、または部分配列を条件として、新しいタンパク質配列を生成します。
from esm.models.esm3 import ESM3
from esm.sdk.api import ESM3InferenceClient, ESMProtein, GenerationConfig
# Load ESM3 locally
model = ESM3.from_pretrained("esm3_sm_open_v1")
# Generate from partial sequence (fill in masked positions)
prompt = ESMProtein(sequence="MKTAYIAK____ISFVK____RQLEERLG") # ____ = positions to generate
config = GenerationConfig(track="sequence", num_steps=10, temperature=0.7)
generated = model.generate(prompt, config)
print(f"Generated sequence: {generated.sequence[:50]}...")
# Conditional generation: design sequence for a target structure
from esm.sdk.api import ESMProtein, GenerationConfig
from esm.utils.structure.protein_chain import ProteinChain
# Load target structure from PDB
chain = ProteinChain.from_pdb("target.pdb")
prompt = ESMProtein.from_protein_chain(chain)
prompt.sequence = None # Clear sequence, keep structure
config = GenerationConfig(track="sequence", num_steps=16, temperature=0.5)
designed = model.generate(prompt, config)
print(f"Designed sequence ({len(designed.sequence)} residues): {designed.sequence[:50]}...")
2. タンパク質の埋め込み(ESM C)
下流の ML タスク向けに固定長の表現を抽出します。
from esm.models.esmc import ESMC
from esm.sdk.api import ESMProtein
import torch
model = ESMC.from_pretrained("esmc_600m") # or "esmc_300m" for lighter model
sequences = [
"MKTAYIAKQRQISFVKSHFSRQLEERLGLIEVQAPILSRVGDGTQDNLSGAEKAVQVKVKALPDAQFEVVHSLAKWKRQQIAATGFHIIPGDKPDNRAGGYDN",
"MKWVTFISLLFLFSSAYSRGVFRRDAHKSEVAHRFKDLGEENFKALVLIAFAQYLQQCPFEDHVKLVNEVTEFAKTCVADESAENCDKS",
]
embeddings = []
for seq in sequences:
protein = ESMProtein(sequence=seq)
output = model(protein)
# Mean-pool per-residue embeddings to get fixed-length vector
mean_emb = output.embeddings.mean(dim=1) # shape: (1, embedding_dim)
embeddings.append(mean_emb)
emb_matrix = torch.cat(embeddings, dim=0)
print(f"Embedding matrix: {emb_matrix.shape}") # (2, 1152)
# Compute pairwise similarity
similarity = torch.cosine_similarity(emb_matrix[0:1], emb_matrix[1:2])
print(f"Cosine similarity: {similarity.item():.4f}")
3. 構造予測
アミノ酸配列から 3D 座標を予測します。
from esm.models.esm3 import ESM3
from esm.sdk.api import ESMProtein, GenerationConfig
model = ESM3.from_pretrained("esm3_sm_open_v1")
protein = ESMProtein(sequence="MKTAYIAKQRQISFVKSHFSRQLEERLGLIEVQAPILSRVGDGTQDNLSGAEKAVQVKVKALPDAQFEVVHSLAKWKRQQIAATGFHIIPGDKPDNRAGGYDN")
# Generate structure from sequence
config = GenerationConfig(track="structure", num_steps=16)
result = model.generate(protein, config)
# Save predicted structure
result.to_pdb("predicted.pdb")
print(f"Saved structure: {len(result.sequence)} residues → predicted.pdb")
4. インバースフォールディング
標的となる 3D 構造に折りたたまれるアミノ酸配列を設計します。
from esm.models.esm3 import ESM3
from esm.sdk.api import ESMProtein, GenerationConfig
from esm.utils.structure.protein_chain import ProteinChain
model = ESM3.from_pretrained("esm3_sm_open_v1")
# Load target structure
chain = ProteinChain.from_pdb("target_structure.pdb")
prompt = ESMProtein.from_protein_chain(chain)
# Clear sequence but keep structure coordinates
prompt.sequence = None
# Generate multiple designs
designs = []
for i in range(5):
config = GenerationConfig(track="sequence", num_steps=16, temperature=0.7)
designed = model.generate(prompt, config)
designs.append(designed.sequence)
print(f"Design {i+1}: {designed.sequence[:40]}...")
print(f"Generated {len(designs)} sequence designs for target structure")
5. 機能条件付け
望ましい機能注釈(GO 用語、酵素活性)を持つタンパク質を生成します。
from esm.models.esm3 import ESM3
from esm.sdk.api import ESMProtein, GenerationConfig
model = ESM3.from_pretrained("esm3_sm_open_v1")
# Condition on functional keywords
protein = ESMProtein(
sequence=None, # generate de novo
function_annotations=["ATP binding", "kinase activity", "protein phosphorylation"],
)
config = GenerationConfig(track="sequence", num_steps=32, temperature=0.7)
result = model.generate(protein, config)
print(f"Function-conditioned sequence: {result.sequence[:50]}...")
print(f"Length: {len(result.sequence)} residues")
6. Forge クラウド API
ローカル GPU を使わず、大規模モデル向けに EvolutionaryScale のクラウド推論を利用します。
from esm.sdk.forge import ESM3ForgeInferenceClient
from esm.sdk.api import ESMProtein, GenerationConfig
# Authenticate (requires FORGE_API_TOKEN env var or explicit token)
client = ESM3ForgeInferenceClient(model="esm3-open-2024-03", token="your_token_here")
protein = ESMProtein(sequence="MKTAYIAKQRQISFVKSHFSRQLEERLG")
config = GenerationConfig(track="structure", num_steps=16)
result = client.generate(protein, config)
result.to_pdb("forge_predicted.pdb")
print("Predicted structure via Forge API → forge_predicted.pdb")
主な概念
ESM3 と ESM C:使い分け
| 機能 | ESM3 | ESM C |
|---|---|---|
| 主な用途 | タンパク質の生成設計 | 埋め込みの抽出 |
| 機能 | 配列生成、構造予測、インバースフォールディング、機能条件付け | 残基ごとの埋め込みと平均プーリングされた埋め込み |
| モデルサイズ | esm3_sm_open_v1(約 14 億パラメーター) | esmc_300m、esmc_600m |
| GPU 要件 | 8 GB 以上の VRAM | 4 GB 以上の VRAM(esmc_300m:2 GB) |
| 用途 | 新しいタンパク質の設計、構造の予測 | 下流の ML(分類、クラスタリング、回帰) |
| クラウドの選択肢 | Forge API(より大規模なモデルを利用可能) | ローカルのみ |
GenerationConfig のパラメーター
GenerationConfig は、ESM3 が出力を生成する方法を制御します。
track:生成するモダリティ("sequence"、"structure"、"function")num_steps:反復改良ステップの数(値が大きいほど品質が向上しますが、処理は遅くなります)temperature:サンプリング温度(0.0 = 貪欲法、0.5~0.7 = 多様性あり、1.0 = 最大の多様性)
ESMProtein オブジェクト
配列、構造座標、機能注釈を保持する中心的なデータコンテナーです。
.sequence— アミノ酸文字列(例:"MKTAY...").coordinates— 原子の 3D 位置(Nx3 テンソル).function_annotations— 機能キーワードのリスト- PDB 構造から読み込むには
ESMProtein.from_protein_chain()を使用します - 予測した構造を保存するには
.to_pdb()を使用します
よくあるワークフロー
ワークフロー 1:タンパク質の埋め込みに基づく分類
目標:タンパク質配列から埋め込みを抽出し、下流の分類器を学習させます。
from esm.models.esmc import ESMC
from esm.sdk.api import ESMProtein
import torch
import numpy as np
model = ESMC.from_pretrained("esmc_600m")
# Embed a set of sequences
sequences = ["MKTAY...", "MKWVT...", "MSGLI..."] # replace with actual sequences
labels = [0, 1, 0] # binary labels
embeddings = []
for seq in sequences:
protein = ESMProtein(sequence=seq)
output = model(protein)
mean_emb = output.embeddings.mean(dim=1).detach().cpu().numpy()
embeddings.append(mean_emb.squeeze())
X = np.array(embeddings)
y = np.array(labels)
print(f"Feature matrix: {X.shape}") # (n_samples, 1152)
# Train a simple classifier
from sklearn.linear_model import LogisticRegression
clf = LogisticRegression(max_iter=1000).fit(X, y)
print(f"Training accuracy: {clf.score(X, y):.2f}")
ワークフロー 2:構造条件付きタンパク質設計
目標:標的構造に折りたたまれる新規配列を複数設計し、予測品質に基づいて順位付けします。
ProteinChain.from_pdb()(コア API モジュール 4)を使って、PDB から標的構造を読み込みます- 構造を含み、配列を含まない ESMProtein プロンプトを作成します
- 多様性を高めるため、
temperature=0.7で 10 個以上の配列デザインを生成します(コア API モジュール 1) - 各デザインについて、設計した配列から構造を予測します(コア API モジュール 3)
- 予測構造と標的構造を比較し(RMSD を計算)、デザインを順位付けします
- 実験的検証に向けて、上位のデザインを選択します
主なパラメーター
| パラメーター | モジュール/関数 | デフォルト | 範囲/選択肢 | 効果 |
|---|---|---|---|---|
num_steps | GenerationConfig | さまざま | 1–64 | 反復改良のステップ数です。増やすと品質が向上しますが、処理が遅くなります |
temperature | GenerationConfig | 1.0 | 0.0–1.5 | サンプリングの多様性です。0.0=貪欲法、0.7=バランス型、1.0 以上=創造的 |
track | GenerationConfig | — | "sequence"、"structure"、"function" | 生成するモダリティです |
| モデル名 | from_pretrained | — | "esm3_sm_open_v1"、"esmc_300m"、"esmc_600m" | モデルサイズと能力のトレードオフです |
token | ESM3ForgeInferenceClient | 環境変数 | API トークン文字列 | Forge クラウド認証に使用します |
ベストプラクティス
-
埋め込みタスクには ESM C、生成には ESM3 を使います:ESM C はより小型で高速であり、表現品質に最適化されています。生成機能(配列設計、構造予測、逆フォールディング)が必要な場合にのみ、ESM3 を使用してください。
-
固定長の表現には残基ごとの埋め込みを平均プーリングします:ESM C は残基ごとの埋め込み(seq_len × dim)を出力します。固定長の入力が必要な下流の ML では、配列次元に沿って平均を取ります:
embeddings.mean(dim=1)。 -
タンパク質設計には温度 0.5~0.7 を使います:温度 1.0 では非常に多様な配列が生成されますが、機能しない可能性があります。温度 0.5~0.7 では多様性と品質のバランスが取れます。決定論的な構造予測には、温度 0.0 のみを使用してください。
-
品質の高い生成には num_steps を増やします:反復改良のステップ数を増やすと、計算時間は長くなりますが、出力品質が向上します。手早く探索するには 8~16 ステップ、最終デザインには 32 ステップ以上を使ってください。
-
GPU の使用率を最大化するために配列をバッチ処理します:一度に 1 つの配列だけを処理すると、GPU を十分に活用できません。多数の配列を埋め込む場合は、VRAM の容量に応じてバッチ処理してください。
-
大規模な推論や大型モデルの推論には Forge API を使います:オープンウェイトの ESM3 は小型のバリアントです。本番品質のタンパク質設計には、より大型のモデルを利用できる Forge API を使用してください。
よく使うレシピ
レシピ:タンパク質のペアワイズ類似度行列
from esm.models.esmc import ESMC
from esm.sdk.api import ESMProtein
import torch
import numpy as np
model = ESMC.from_pretrained("esmc_300m")
sequences = {
"Protein_A": "MKTAYIAKQRQISFVK...",
"Protein_B": "MKWVTFISLLFLFSSAYS...",
"Protein_C": "MSGLILQRAAVIAAGASSAG...",
}
# Extract embeddings
embs = {}
for name, seq in sequences.items():
protein = ESMProtein(sequence=seq)
output = model(protein)
embs[name] = output.embeddings.mean(dim=1).detach().squeeze()
# Compute similarity matrix
names = list(embs.keys())
sim_matrix = np.zeros((len(names), len(names)))
for i, n1 in enumerate(names):
for j, n2 in enumerate(names):
sim_matrix[i, j] = torch.cosine_similarity(embs[n1].unsqueeze(0), embs[n2].unsqueeze(0)).item()
print("Similarity matrix:")
for i, name in enumerate(names):
print(f" {name}: {sim_matrix[i].round(3)}")
レシピ:埋め込みの保存と再読み込みによる再利用
from esm.models.esmc import ESMC
from esm.sdk.api import ESMProtein
import torch
import numpy as np
model = ESMC.from_pretrained("esmc_600m")
# Generate and save
protein = ESMProtein(sequence="MKTAYIAKQRQISFVK...")
output = model(protein)
np.save("embedding.npy", output.embeddings.detach().cpu().numpy())
print("Saved embedding.npy")
# Load later (no GPU needed)
embedding = np.load("embedding.npy")
print(f"Loaded embedding: {embedding.shape}")
トラブルシューティング
| 問題 | 原因 | 解決策 |
|---|---|---|
CUDA out of memory | モデルが GPU に対して大きすぎます | より小型のモデル(esmc_300m)を使う、バッチサイズを小さくする、または Forge クラウド API を使ってください |
RuntimeError: no CUDA device | 利用可能な GPU がありません | モデルは CPU でも動作します(低速です)。device="cpu" を設定するか、Forge API を使ってください |
| 生成が遅い | num_steps が多すぎる、または CPU で推論しています | num_steps を減らす(ドラフトには 8)、GPU を使う、または大型モデルには Forge API を使ってください |
ImportError: esm | パッケージがインストールされていません | pip install esm(注:これは EvolutionaryScale の esm であり、以前の Facebook Research の esm ではありません) |
| 生成された配列の品質が低い | 温度が高すぎる、またはステップ数が少なすぎます | 温度を 0.5 に下げ、num_steps を 32 以上に増やしてください |
| Forge API の認証エラー | API トークンが無効、または設定されていません | FORGE_API_TOKEN 環境変数を設定するか、token= を明示的に渡してください。トークンは forge.evolutionaryscale.ai から取得できます |
モデルの重みを読み込む際の KeyError | モデル名が間違っています | 正確な名前を使用してください:"esm3_sm_open_v1"、"esmc_300m"、"esmc_600m" |
関連スキル
- alphafold-database-access — AlphaFold DB から予測された構造を取得します。ESM はデノボ構造予測に使用します
- biopython — 配列の入出力とアラインメントを行います。ESM の埋め込みを行う前に配列を前処理します
- scikit-learn — ESM の埋め込みを用いた下流の機械学習(分類、クラスタリング、回帰)
- rdkit — 小分子の創薬設計に用いるケモインフォマティクス(タンパク質設計を補完します)
参考資料
- ESM GitHub — ソースコードとモデルの重み
- EvolutionaryScale Forge — クラウド推論 API
- Hayes et al. (2024)「Simulating 500 million years of evolution with a language model」 — bioRxiv
- Lin et al. (2023)「Evolutionary-scale prediction of atomic-level protein structure with a language model」 — Science