Auto-hospedagem de um LLM OpenSource para DiscourseAI

O plugin Discourse AI possui muitos recursos que exigem um LLM ativado, como, por exemplo, Sumarização, Assistente de IA, Pesquisa por IA, Bot de IA. Embora você possa usar uma API de terceiros, como Configurar Chaves de API para OpenAI ou Configurar Chaves de API para Anthropic, nós construímos o Discourse AI desde o primeiro dia para não ficarmos presos a eles.

Executando com HuggingFace TGI

A HuggingFace fornece uma imagem de contêiner impressionante que pode colocá-lo em funcionamento rapidamente.

Por exemplo:

mkdir -p /opt/tgi-cache
docker run --rm --gpus all --shm-size 1g -p 8080:80 \
  -v /opt/tgi-cache:/data \
  ghcr.io/huggingface/text-generation-inference:latest \
  --model-id mistralai/Mistral-7B-Instruct-v0.2

Deve colocá-lo em funcionamento com uma instância local do Mistral 7B Instruct no localhost na porta 8080, que pode ser testada com

curl http://localhost:8080/ \
    -X POST \
    -H 'Content-Type: application/json' \
    -d '{"inputs":"<s>[INST] What is your favourite condiment? [/INST] Well, I'm quite partial to a good squeeze of fresh lemon juice. It adds just the right amount of zesty flavour to whatever I'm cooking up in the kitchen!</s> [INST] Do you have mayonnaise recipes? [/INST]","parameters":{"max_new_tokens":500, "temperature":0.5,"top_p": 0.9}}'

Executando com vLLM

Outra opção para auto-hospedar LLMs que o Discourse AI suporta é o vLLM, que é um projeto muito popular, licenciado sob a Licença Apache.

Veja como começar com um modelo:

mkdir -p /opt/vllm-cache
docker run --gpus all \
  -v /opt/vllm-cache:/root/.cache/huggingface \
  -e "MODEL=mistralai/Mistral-7B-Instruct-v0.2" \
  -p 8080:8000 --ipc=host vllm/vllm-openai:latest

Que você pode testar com

curl -X POST http://localhost:8080/v1/completions \
-H "Content-Type: application/json" \
-d '{
"model": "mistralai/Mistral-7B-Instruct-v0.2",
"prompt": "<s> [INST] What was the latest released hero for Dota 2? [/INST] The latest released hero for Dota 2 was", "max_tokens": 200}'

Executando com Ollama

Ollama é outra opção popular para executar modelos de código aberto localmente. Ele simplifica o gerenciamento de modelos e fornece uma API compatível com a OpenAI.

ollama pull mistral
ollama serve

Isso inicia um servidor local em http://localhost:11434 ao qual o Discourse AI pode se conectar usando o provedor Ollama.

Tornando-o disponível para sua instância do Discourse

Na maioria das vezes, você estará executando isso em um servidor dedicado devido ao requisito de GPU. Ao fazer isso, recomendo executar um proxy reverso, fazendo terminação TLS e protegendo o endpoint para que ele só possa ser conectado pela sua instância do Discourse.

Configurando o Discourse AI

As conexões de LLM são agora configuradas através da UI de administração em vez das configurações do site. Navegue até /admin/plugins/discourse-ai/ai-llms e adicione um novo LLM:

  1. Clique em New (Novo) para adicionar um modelo
  2. Selecione um Provider (Provedor) — escolha vLLM, Hugging Face ou Ollama, dependendo do seu servidor de inferência
  3. Insira a URL do seu endpoint de inferência (por exemplo, http://seu-servidor:8080)
  4. Insira uma API key (chave de API) se o seu endpoint exigir uma
  5. Preencha o model name (nome do modelo), tokenizer, max prompt tokens (tokens máximos de prompt) e outros detalhes do modelo

Assim que seu LLM for adicionado, defina-o como o padrão através da configuração do site ai_default_llm_model, ou atribua-o a recursos específicos através da sua configuração de agente em /admin/plugins/discourse-ai/ai-features.

17 curtidas

Para quem estiver pesquisando este tópico com/para:
#Chaves-de-API-Llava

Eu também estou usando o vLLM. Eu também recomendaria o modelo openchat v3.5 0106, que é um modelo de 7 bilhões de parâmetros que tem um desempenho muito bom.

Na verdade, estou executando-o com quantização de 4 bits para que ele rode mais rápido.

Estou designando esta tarefa a um estagiário. Há recomendações de alguém sobre qual serviço específico assinar? Isto é para um teste. O estagiário atualmente tem um teste configurado com OpenAI. Funciona bem. Eles estão interessados em experimentar o HuggingFace TGI, mas parece que preciso dar a eles um servidor dedicado com GPU? Quais são as especificações mínimas para um teste?

Existem links que posso dar ao estagiário?

Ainda não analisei este projeto em profundidade. Estou apenas antecipando que o estagiário precisará de alguns recursos e estou tentando fazer algumas recomendações razoáveis sobre serviços para o estagiário em pesquisa.

Olá, ao expor com um certificado autoassinado vllm container em uma caixa de GPU on-prem, não encontrei uma boa maneira de adicionar o Root CA ao container discourse para que ele possa acessar com segurança este serviço on-prem via https.

exemplo:

./launcher enter app
curl -L https://vllm.infra.example.com/v1/models
curl: (60) SSL certificate problem: unable to get local issuer certificate
More details here: https://curl.se/docs/sslcerts.html

curl falhou em verificar a legitimidade do servidor e, portanto, não pôde
estabelecer uma conexão segura com ele. Para saber mais sobre esta situação e
como corrigi-la, visite a página da web mencionada acima.

Existe uma boa maneira de adicionar um certificado raiz autoassinado no container discourse que sobreviveria às atualizações da imagem do container?

Pelo que sei, adicioná-lo no app.yml

run:
  - exec: wget ... && update-ca-certificates

só funcionaria bem durante a construção/reconstrução do aplicativo.

Qualquer dica é bem-vinda.

14 posts foram divididos em um novo tópico: Fazendo o discourse ai funcionar com ollama localmente

Haveria alguma maneira de adicionar um cabeçalho HTTP personalizado às requisições do Discourse AI? Temos um servidor equipado com GPU que usamos para diversos fins, ele possui uma API compatível com a OpenAI, mas por segurança, o colocamos atrás de um gateway de gerenciamento de API, que exige um cabeçalho HTTP personalizado (algo como SubscriptionKey) e fornecemos nossa chave de autenticação aqui.

Note que esta chave de autenticação é para passar pelo APIM e é diferente da chave de API que se forneceria para um serviço como a API da OpenAI.

Seria ótimo se houvesse uma maneira de adicionar Cabeçalhos Personalizados na configuração de cada LLM na página de configuração admin/plugins/discourse-ai/ai-llms. Talvez uma opção ‘Personalizado’ no menu suspenso ‘Provedor’, com opções adicionais para casos de uso como este?

1 curtida

A resposta rápida é um plugin para adicionar esse cabeçalho. Uma solução alternativa pode ser um servidor proxy local que você acessaria a partir do Discourse, que adicionaria o cabeçalho e enviaria os dados de volta para o Discourse. Uma fonte não confiável sugere que você pode conseguir que o NGINX faça isso para você com algo como

server {
    listen 80;
    
    location / {
        proxy_pass https://api.example.com;
        proxy_set_header SubscriptionKey xyz;
        proxy_set_header Host $host;
    }
}

Pode haver uma maneira inteligente de adicionar isso à configuração nginx do Discourse em algum caminho secreto (que também escutaria apenas o seu servidor).

1 curtida