gRPC inference service for a multilingual BigARTM topic model: document embeddings and topic explanations.
Contract: redup.topicmodel.v1 (GetDocumentsEmbedding, GetTopicExplanation).
PyPI package: redup-topicmodel.
Weights and tokenizers are published on Hugging Face:
redup-ai/topicmodel-multilingual
Expected artifact layout:
<data>/
artm/parameters.bin
artm/p_wt.bin
tokenizers.json.gz
config.json
Download locally:
pip install huggingface_hub
python -c "from huggingface_hub import snapshot_download; print(snapshot_download('redup-ai/topicmodel-multilingual'))"config/config.yaml:
service:
port: "[::]:9878"
TopicModel:
artifact_root: /data # HF artifact root (Docker default mount)
num_processors: 1Override without editing the file via servicekit env substitution (section___key):
export TopicModel___artifact_root=/path/to/topicmodel-multilingualInstead of artifact_root, you can set paths explicitly: model_path (artm/ directory) and bpe_path (tokenizers.json.gz or a tokenizers directory) — also overridable as TopicModel___model_path / TopicModel___bpe_path.
Pull the published image and mount the downloaded artifacts at /data (as in the config):
docker run --rm -p 9878:9878 \
-v /path/to/topicmodel-multilingual:/data:ro \
redup4ai/redup.python.topicmodel:0.1.0-3.11-slimThe service listens for gRPC on port 9878.
Call it from Python:
import asyncio
from redup_proto_topicmodel.client import Client
from redup_proto_topicmodel.redup.topicmodel.v1.topicmodel_pb2 import (
Document,
DocumentPack,
)
async def main():
client = Client("grpc://localhost:9878")
pack = DocumentPack(documents=[
Document(
document_id="doc-en",
tokens=["hello", "world"],
modalities={"lang": "en"},
),
])
response = await client.get_documents_embedding("example", pack)
print(response["embeddings"])
asyncio.run(main())python -m venv .venv && source .venv/bin/activate
pip install -r src/requirements.txt
pip install -e src
export PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python
export TopicModel___artifact_root=/path/to/topicmodel-multilingual
PYTHONPATH=src python -m redup_topicmodel.service config/config.yamlPYTHONPATH=src python -m pytest tests -q -m "not smoke"Smoke test with a real model (requires TOPICMODEL_DATA or TopicModel___artifact_root):
export TOPICMODEL_DATA=/path/to/topicmodel-multilingual
PYTHONPATH=src python -m pytest tests -q --smokeMIT — see LICENSE.
Parts of the inference logic are adapted from text_categorization (Copyright (c) 2020, Machine Intelligence Team), BSD 3-Clause. See NOTICE and third_party/text_categorization/.