これは、なにをしたくて書いたもの?
ローカルで動かせる日本語のモデルはたまに把握しておきたいと思うのですが、今回はテキスト埋め込みモデルであるPLaMo-Embedding-1Bを
少し動かしてみます。
ついでに、他のモデルも少しメモ。
PLaMo-Embedding-1B
PLaMo-Embedding-1Bについてのブログはこちら。
テキスト埋め込みモデルPLaMo-Embedding-1Bの開発 - Preferred Networks Research & Development
Hugging Faceで公開されています。
pfnet/plamo-embedding-1b · Hugging Face
JMTEBのベンチマークで計測するとかなり高くなるようです。
Leaderboard。
https://github.com/sbintuitions/JMTEB/blob/main/leaderboard.md
現在は、他にはこのあたりのモデルもスコアが高いようです。
PLaMo-Embedding-1BはTransformer、Sarashina-Embedding-v1-1BとRuri v3はSentence Transformersで動かすようです。
サンプルコードを動かしてみます。
環境
今回の環境はこちら。
$ python3 --version Python 3.12.3 $ uv --version uv 0.8.14
CPU環境です。
PLaMo-Embedding-1Bを動かしてみる
uvでプロジェクトを作成。
$ uv init --vcs none plamo-embedding-example $ cd plamo-embedding-example $ rm main.py
ライブラリーを追加。
$ uv add sentencepiece torch transformers $ uv add --dev mypy ruff
pyproject.toml
[project]
name = "plamo-embedding-example"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.12"
dependencies = [
"sentencepiece>=0.2.1",
"torch>=2.8.0",
"transformers>=4.56.0",
]
[dependency-groups]
dev = [
"mypy>=1.17.1",
"ruff>=0.12.11",
]
[tool.mypy]
strict = true
disallow_any_unimported = true
disallow_any_expr = true
disallow_any_explicit = true
warn_unreachable = true
pretty = true
インストールされたライブラリーの一覧。
$ uv pip list Package Version ------------------------ --------- certifi 2025.8.3 charset-normalizer 3.4.3 filelock 3.19.1 fsspec 2025.7.0 hf-xet 1.1.9 huggingface-hub 0.34.4 idna 3.10 jinja2 3.1.6 markupsafe 3.0.2 mpmath 1.3.0 mypy 1.17.1 mypy-extensions 1.1.0 networkx 3.5 numpy 2.3.2 nvidia-cublas-cu12 12.8.4.1 nvidia-cuda-cupti-cu12 12.8.90 nvidia-cuda-nvrtc-cu12 12.8.93 nvidia-cuda-runtime-cu12 12.8.90 nvidia-cudnn-cu12 9.10.2.21 nvidia-cufft-cu12 11.3.3.83 nvidia-cufile-cu12 1.13.1.3 nvidia-curand-cu12 10.3.9.90 nvidia-cusolver-cu12 11.7.3.90 nvidia-cusparse-cu12 12.5.8.93 nvidia-cusparselt-cu12 0.7.1 nvidia-nccl-cu12 2.27.3 nvidia-nvjitlink-cu12 12.8.93 nvidia-nvtx-cu12 12.8.90 packaging 25.0 pathspec 0.12.1 pyyaml 6.0.2 regex 2025.8.29 requests 2.32.5 ruff 0.12.11 safetensors 0.6.2 sentencepiece 0.2.1 setuptools 80.9.0 sympy 1.14.0 tokenizers 0.22.0 torch 2.8.0 tqdm 4.67.1 transformers 4.56.0 triton 3.4.0 typing-extensions 4.15.0 urllib3 2.5.0
あとは動かしてみます。
サンプルコードを参考に、こんな感じで作成。
app.py
import torch import torch.nn.functional as F from transformers import AutoModel, AutoTokenizer tokenizer = AutoTokenizer.from_pretrained( "pfnet/plamo-embedding-1b", trust_remote_code=True ) model = AutoModel.from_pretrained("pfnet/plamo-embedding-1b", trust_remote_code=True) device = "cuda" if torch.cuda.is_available() else "cpu" model = model.to(device) query = "PLaMo-Embedding-1Bとはなんですか?" documents = [ "PLaMo-Embedding-1Bは、Preferred Networks, Inc. によって開発された日本語テキスト埋め込みモデルです。", "最近は随分と暖かくなりましたね。", ] with torch.inference_mode(): query_embedding = model.encode_query(query, tokenizer) print(f"query embegging: {query_embedding}, size: {query_embedding.numel()}") document_embeddings = model.encode_document(documents, tokenizer) print( f"document embeddings: {document_embeddings}, size: {document_embeddings[0].numel()}, {document_embeddings[1].numel()}" ) similarities = F.cosine_similarity(query_embedding, document_embeddings) print(f"similarities: {similarities}")
追加しているのは要素数を表示しているくらいですけどね。
確認。
$ uv run app.py
query embegging: tensor([[-1.6400, 0.2824, 0.7169, ..., -4.3330, -2.5590, 2.6742]]), size: 2048
document embeddings: tensor([[ 0.8587, -1.4075, 0.8854, ..., -1.5349, -7.1651, 1.8051],
[-3.8246, 5.2329, 4.4291, ..., 5.3871, -3.0507, -4.3188]]), size: 2048, 2048
similarities: tensor([0.8371, 0.4783])
実行時間入り。
$ time uv run app.py
query embegging: tensor([[-1.6400, 0.2824, 0.7169, ..., -4.3330, -2.5590, 2.6742]]), size: 2048
document embeddings: tensor([[ 0.8587, -1.4075, 0.8854, ..., -1.5349, -7.1651, 1.8051],
[-3.8246, 5.2329, 4.4291, ..., 5.3871, -3.0507, -4.3188]]), size: 2048, 2048
similarities: tensor([0.8371, 0.4783])
real 0m5.261s
user 0m16.147s
sys 0m2.751s
ひとまず動かしてみただけですが、今回はここまでで。
おわりに
ローカルで動く日本語のテキスト埋め込みモデル、PLaMo-Embedding-1Bを動かしてみました。
本当に動かしてみただけなのですが、最近このあたりの情報を追っていなかったのでそのあたりを見返す意味も含めて扱ってみました。
あまり頻繁に使うことはないと思うのですが、時々触っていないと完全に忘れてしまうので。