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#

  1. Создайте пространство имен inference:

    kubectl create namespace inference
    
  2. Примените 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
    
  3. Запустите рабочие 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
    
  4. Запустите 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
    
  5. Проверьте статус 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