Guia de Auto-Hospedagem do Discourse AI

Existe algum motivo específico para esses comandos do Docker não estarem em modo detached (faltando -d)?

Se você quer dizer “Eu não deveria iniciá-los com -d?”, a resposta provavelmente é sim.

Se você realmente quer dizer “Por que o OP não me disse para iniciar esses comandos com -d?”, eu acho que eles são destinados a serem apenas exemplos de como você pode iniciá-los e fazê-los funcionar. Na prática, você vai querer fazer algum <outra coisa> para iniciá-los de uma forma que os torne úteis em produção.

3 curtidas

Essa é exatamente a minha pergunta e você acertou em cheio. Faz um tempo que não configuro minhas instâncias Docker, mas isso está voltando agora. Quando você diz “outras coisas” que eu deveria fazer para torná-las úteis para produção, há algo mais que deveria estar gritando para mim “FAÇA ISSO!” (além do óbvio de mudar o número da porta do mesmo 6666 em cada uma das instâncias do docker)?

OK. Então, para as chaves de API separadas por pipe, elas são completamente arbitrárias em relação ao host do serviço e nós apenas especificamos quaisquer chaves alfanuméricas que queremos aceitar do cliente?

Como mudar a porta é menos “óbvio” do que executá-la em segundo plano?

Essa é a questão. Sem ter conhecimento íntimo do que você considera óbvio, é impossível responder à pergunta. Na maioria das vezes, se você não tem certeza de que sabe como tornar as coisas úteis, provavelmente precisa de ajuda que não pode obter aqui. :person_shrugging:

Porque já executei dezenas de contêineres Docker no passado. Eu só não mexi com Docker nos últimos dois anos e mergulhei fundo. Não foi óbvio no início, já que não o tocava há algum tempo, mas esse conhecimento fundamental básico para usar o Docker voltou com a discussão.

Essa é a questão. Sem ter conhecimento íntimo do que você acha óbvio, é impossível responder à pergunta. Principalmente, se você não tem certeza de como tornar as coisas úteis, então provavelmente precisa de ajuda que não pode obter aqui. :person_shrugging:

Essa é a questão, no entanto. Às vezes, o óbvio não é óbvio nem mesmo para aqueles que têm experiência com diferentes sistemas Docker como eu. Pode-se interpretar o que você disse como: você deve saber a resposta para a pergunta antes de fazê-la. Entenda que alguns de nós administram comunidades como um serviço voluntário e não passam 24 horas por dia, 7 dias por semana, aprendendo os detalhes mais íntimos do Discourse, até mesmo as estruturas de dados do Postgres e tal. Sinto que você estava me dispensando e isso não foi apreciado no que deveria ser um fórum comunitário onde todos deveriam estar ajudando uns aos outros livre e felizmente.

Para o ponto aqui, eu fiz algumas pesquisas no Google para tentar determinar como API_KEYS deve ser utilizado e não obtive sucesso. Entendo que posso estar perdendo o óbvio e que isso pode ser francamente frustrante para um profissional de Discourse como você, com amplo conhecimento da plataforma até o nível mais baixo, mas estou tentando ter uma discussão comunitária aqui para que outros que não estão necessariamente no seu nível de habilidade ainda possam se beneficiar. Afinal, o objetivo é que pessoas além dos desenvolvedores do Discourse também possam usar este software.

1 curtida

Eu sinto sua dor. Encontrar algum serviço que estou executando e ter pouca ideia de como o iniciei acontece com mais frequência do que eu gostaria.

Certo. Mesmo as instruções que escrevemos para nós mesmos não fazem sentido quando precisamos delas.

Desculpe. Eu não quis ser rude ou mal-educado, e parece que fui. Meu ponto era apenas que já é difícil o suficiente dar suporte a pessoas que executam a Instalação Padrão, então descobrir quais são suas habilidades e como você planeja lançá-lo e se ele estará na internet aberta e se você sabe como ou deseja protegê-lo com https (você provavelmente quer, se acha que está protegendo-o com chaves de API) é difícil.

Sim. Se você está colocando isso em algum lugar que outra pessoa possa contatar, acho que você vai querer definir essa variável API_KEYS e encontrar alguma maneira de gerar algo aleatório para usar como chave. E então você inseriria a mesma chave nas configurações do plugin. Foi o que eu fiz. Eu não verifiquei se usar a chave errada o quebraria, o que, francamente, acho que deveria ter feito. Talvez eu faça isso na instância à qual estou prestes a adicionar o plugin.

Mas pode ser melhor se o OP incluísse o -d e definisse a variável de ambiente API_KEYS.

1 curtida

o parâmetro API_KEYS é opcional que você pode usar se, por qualquer motivo, quiser restringir o serviço apenas a clientes que fornecem uma das API_KEYS configuradas em seu cabeçalho.

Algo que você realmente não precisa se estiver executando internamente para uma única instância, mas que pode ser útil se estiver executando pela internet ou em um ambiente compartilhado.

3 curtidas

Obrigado @Falco e @pfaffman pela ajuda e desculpe se desviei o assunto aqui! A ajuda de vocês dois foi muito apreciada! :smiley:

2 curtidas

Todos esses serviços podem ser usados por várias instalações do Discourse, ou devem ser executados por site?

1 curtida

Todos eles podem ser compartilhados com segurança entre instâncias.

2 curtidas

Ainda é possível usar a Sumarização com chaves de API da OpenAI?

Sim, preencha as chaves e escolha um modelo OpenAI nas configurações de sumarização.

1 curtida

Há um pequeno problema se o tópico estiver usando um idioma diferente do inglês ou um idioma menor — uma vez ele usa o idioma certo e de repente começa a usar o inglês. De qualquer forma, a mudança de idioma parece acontecer totalmente aleatoriamente.

Estou testando o endpoint de sumarização:

docker run -d --rm --gpus all --shm-size 1g -p 80:80 -v /mnt:/data -e GPTQ_BITS=4 -e GPTQ_GROUPSIZE=32 -e REVISION=gptq-4bit-32g-actorder_True ghcr.io/huggingface/text-generation-inference:latest --model-id TheBloke/Upstage-Llama-2-70B-instruct-v2-GPTQ --max-batch-prefill-tokens=12000 --max-total-tokens=12000 --max-input-length=10000 --quantize=gptq --sharded=true --num-shard=$(lspci | grep NVIDIA | wc -l | tr -d '\\n') --rope-factor=2

No entanto, quando o executo, recebo o seguinte erro. Esta máquina tem (2) Tesla T4s e nenhum outro processo está acessando as GPUs. Veja o uso abaixo.

user@gpu2-hc1node:~$ sudo docker logs -f 68e27eb51ee1
2023-12-14T21:30:12.861320Z  INFO text_generation_launcher: Args { model_id: "TheBloke/Upstage-Llama-2-70B-instruct-v2-GPTQ", revision: Some("gptq-4bit-32g-actorder_True"), validation_workers: 2, sharded: Some(true), num_shard: Some(2), quantize: Some(Gptq), speculate: None, dtype: None, trust_remote_code: false, max_concurrent_requests: 128, max_best_of: 2, max_stop_sequences: 4, max_top_n_tokens: 5, max_input_length: 10000, max_total_tokens: 12000, waiting_served_ratio: 1.2, max_batch_prefill_tokens: 12000, max_batch_total_tokens: None, max_waiting_tokens: 20, hostname: "68e27eb51ee1", port: 80, shard_uds_path: "/tmp/text-generation-server", master_addr: "localhost", master_port: 29500, huggingface_hub_cache: Some("/data"), weights_cache_override: None, disable_custom_kernels: false, cuda_memory_fraction: 1.0, rope_scaling: None, rope_factor: Some(2.0), json_output: false, otlp_endpoint: None, cors_allow_origin: [], watermark_gamma: None, watermark_delta: None, ngrok: false, ngrok_authtoken: None, ngrok_edge: None, env: false }
2023-12-14T21:30:12.861350Z  INFO text_generation_launcher: Sharding model on 2 processes
2023-12-14T21:30:12.861441Z  INFO download: text_generation_launcher: Starting download process.
2023-12-14T21:30:19.986231Z  INFO text_generation_launcher: Files are already present on the host. Skipping download.

2023-12-14T21:30:20.771527Z  INFO download: text_generation_launcher: Successfully downloaded weights.
2023-12-14T21:30:20.771941Z  INFO shard-manager: text_generation_launcher: Starting shard rank=1
2023-12-14T21:30:20.771967Z  INFO shard-manager: text_generation_launcher: Starting shard rank=0
2023-12-14T21:30:27.769624Z  WARN text_generation_launcher: Disabling exllama v2 and using v1 instead because there are issues when sharding

2023-12-14T21:30:27.997163Z  WARN text_generation_launcher: Disabling exllama v2 and using v1 instead because there are issues when sharding

2023-12-14T21:30:28.046134Z  WARN text_generation_launcher: Unable to use Flash Attention V2: GPU with CUDA capability 7 5 is not supported for Flash Attention V2

2023-12-14T21:30:28.071687Z  WARN text_generation_launcher: Could not import Mistral model: Mistral model requires flash attn v2

2023-12-14T21:30:28.072298Z  WARN text_generation_launcher: Could not import Mixtral model: Mistral model requires flash attn v2

2023-12-14T21:30:28.241375Z  WARN text_generation_launcher: Unable to use Flash Attention V2: GPU with CUDA capability 7 5 is not supported for Flash Attention V2

2023-12-14T21:30:28.262756Z  WARN text_generation_launcher: Could not import Mistral model: Mistral model requires flash attn v2

2023-12-14T21:30:28.263363Z  WARN text_generation_launcher: Could not import Mixtral model: Mistral model requires flash attn v2

2023-12-14T21:30:30.786133Z  INFO shard-manager: text_generation_launcher: Waiting for shard to be ready... rank=1
2023-12-14T21:30:30.786133Z  INFO shard-manager: text_generation_launcher: Waiting for shard to be ready... rank=0
2023-12-14T21:30:40.348755Z ERROR text_generation_launcher: Error when initializing model
Traceback (most recent call last):
  File "/opt/conda/lib/python3.10/site-packages/text_generation_server/utils/weights.py", line 191, in get_multi_weights_col
    qweight = torch.cat(
torch.cuda.OutOfMemoryError: CUDA out of memory. Tried to allocate 112.00 MiB. GPU 0 has a total capacty of 14.76 GiB of which 74.75 MiB is free. Process 19973 has 14.68 GiB memory in use. Of the allocated memory 13.73 GiB is allocated by PyTorch, and 74.36 MiB is reserved by PyTorch but unallocated. If reserved but unallocated memory is large try setting max_split_size_mb to avoid fragmentation. See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF

nvidia-smi após o modelo travar.

Thu Dec 14 15:39:55 2023       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 470.223.02   Driver Version: 470.223.02   CUDA Version: 11.4     |
|-------------------------------+----------------------+----------------------|
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  Tesla T4            Off  | 00000000:86:00.0 Off |                    0 |
| N/A   54C    P0    28W /  70W |      0MiB / 15109MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
|   1  Tesla T4            Off  | 00000000:AF:00.0 Off |                    0 |
| N/A   55C    P0    28W /  70W |      0MiB / 15109MiB |      5%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

Quando inicio o modelo, vejo o uso da GPU aumentar para cerca de 100% em ambas as GPUs e, em seguida, ele trava.

Dois T4 são muito pouco para esse modelo. Você pode tentar algo como um modelo compatível de 7B nesses.

2 curtidas

Consegui executar o seguinte modo em um T4

sudo docker run --gpus all --shm-size 1g -p 80:80 -v /home/deeznnutz/discourse/data:/data ghcr.io/huggingface/text-generation-inference:1.3 --model-id tiiuae/falcon-7b-instruct --max-batch-prefill-tokens 2048

Consigo testá-lo localmente e funciona:

curl https://Public_URL/generate     -X POST     -d '{\"inputs\":\"What is Deep Learning?\",\"parameters\":{\"max_new_tokens\":20}}'     -H 'Content-Type: application/json'
{\"generated_text\":\"\\nDeep learning is a branch of machine learning that uses artificial neural networks to learn and make decisions.\"}

No entanto, quando tento executá-lo no Discourse, com estas configurações

ai summarization discourse service api endpoint: https://URL/generate/
ai summarization discourse service api key: random numbers
summarization strategy: Discourse AI's long-t5-tglobal....-book-summary

Recebo o seguinte erro.

Message (6 copies reported)

Job exception: Net::HTTPBadResponse


Backtrace

/var/www/discourse/plugins/discourse-ai/lib/inference/discourse_classifier.rb:13:in `perform!'
/var/www/discourse/plugins/discourse-ai/lib/summarization/strategies/truncate_content.rb:46:in `completion'
/var/www/discourse/plugins/discourse-ai/lib/summarization/strategies/truncate_content.rb:42:in `summarize_with_truncation'
/var/www/discourse/plugins/discourse-ai/lib/summarization/strategies/truncate_content.rb:23:in `summarize'
/var/www/discourse/app/services/topic_summarization.rb:38:in `summarize'
/var/www/discourse/app/jobs/regular/stream_topic_summary.rb:25:in `execute'
/var/www/discourse/app/jobs/base.rb:292:in `block (2 levels) in perform'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rails_multisite-5.0.0/lib/rails_multisite/connection_management.rb:82:in `with_connection'
/var/www/discourse/app/jobs/base.rb:279:in `block in perform'
/var/www/discourse/app/jobs/base.rb:275:in `each'

Você precisa definir a URL desse serviço em ai_hugging_face_api_url

Parece que as estratégias de sumarização disponíveis não suportam o modelo que estou executando.

ghcr.io/huggingface/text-generation-inference:1.3 --model-id tiiuae/falcon-7b-instruct

Estou apenas imaginando se você instala e executa o serviço de classificação de toxicidade, como você o desativa ou desinstala corretamente? Obrigado.