SMG#
Shepherd Model Gateway (SMG) — высокопроизводительный шлюз маршрутизации LLM-запросов. Предназначен для централизованного управления рабочими инференс-узлами и балансировки трафика между развернутыми локально (self-hosted) и облачными моделями, предоставляемыми внешними провайдерами через API по подписке.
SMG обеспечивает маршрутизацию запросов к различным инференс-движкам (vLLM, TensorRT-LLM, TokenSpeed, SGLang, Ollama) и облачным провайдерам (OpenAI, Anthropic, Gemini, AWS Bedrock, Azure OpenAI) независимо от их внутреннего устройства.
Основные функции:
Подключение к автономным моделям (vLLM, TensorRT-LLM, TokenSpeed, SGLang, Ollama) или облачным провайдерам (OpenAI, Anthropic, Gemini, Bedrock и другим) через единую унифицированную точку подключения.
Максимизация использования GPU, достигаемая за счет
cache-aware routingс учетом состояния KV-cache inference-движка, позволяющая переиспользовать префиксы и сокращать избыточные вычисления.Высокая производительность, обеспечиваемая встроенным Rust, решениями о маршрутизации за миллисекунды и токенизацией с нулевым копированием.
Отказоустойчивость, реализуемая через автоматические выключатели и автоматическое переключение на другой ресурс.
Мультитенантное ограничение скорости с помощью OIDC, плагинов WebAssembly для пользовательской логики и границы конфиденциальности, которая хранит историю разговоров в инфраструктуре.
Множество метрик Prometheus, OpenTelemetry и структурированные JSON-логи с корреляцией запросов.
Установка SMG#
Создайте пространство имен
inference:kubectl create namespace inferenceПримените RBAC:
kubectl apply -f rbac.yaml -n inferenceПример конфигурации
rbac.yaml:rbac.yaml
apiVersion: v1 kind: ServiceAccount metadata: name: smg namespace: inference --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: smg-discovery namespace: inference rules: - apiGroups: [""] resources: ["pods"] verbs: ["get", "list", "watch"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: smg-discovery namespace: inference subjects: - kind: ServiceAccount name: smg namespace: inference roleRef: kind: Role name: smg-discovery apiGroup: rbac.authorization.k8s.ioЗапустите рабочие pod:
kubectl apply -f worker.yaml -n inferenceПример конфигурационного файла
worker.yaml:worker.yaml
apiVersion: apps/v1 kind: StatefulSet metadata: name: sglang-worker namespace: inference spec: serviceName: sglang-worker replicas: 3 selector: matchLabels: app: sglang-worker template: metadata: labels: app: sglang-worker spec: containers: - name: sglang image: lmsysorg/sglang:latest args: - --model-path=meta-llama/Llama-3.1-8B-Instruct - --port=8000 ports: - containerPort: 8000Запустите pod SMG:
kubectl apply -f smg.yaml -n inferenceПример конфигурационного файла
smg.yaml:smg.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: smg namespace: inference spec: replicas: 1 selector: matchLabels: app: smg template: metadata: labels: app: smg spec: serviceAccountName: smg containers: - name: smg image: ghcr.io/lightseekorg/smg:latest args: - --service-discovery - --selector=app=sglang-worker - --service-discovery-namespace=inference - --service-discovery-port=8000 - --policy=cache_aware ports: - containerPort: 8000 name: httpПроверьте статус pod в пространстве имен
inference:kubectl get pods -n inferenceПример вывода:
NAME READY STATUS RESTARTS AGE smg-7d9f2b8c4e-3a1b2 1/1 Running 0 2m sglang-worker-0 1/1 Running 0 3m sglang-worker-1 1/1 Running 0 3m sglang-worker-2 1/1 Running 0 3m