Guía de autoalojamiento de Discourse AI

¿Hay alguna razón en particular por la que estos comandos de Docker no estén en modo detached (falta -d)?

Si te refieres a “¿No debería lanzarlos con -d?”, la respuesta es probablemente sí.

Si realmente te refieres a “¿Por qué el OP no me dijo que lanzara estos comandos con -d?”, creo que están pensados solo como ejemplos de cómo podrías iniciarlos y hacer que funcionen. En la práctica, querrás hacer algo de \u003cotra cosa\u003e para lanzarlos de una manera que los haga útiles en producción.

3 Me gusta

Esa es exactamente mi pregunta y has dado en el clavo. Ha pasado un tiempo desde que configuré mis instancias de Docker, pero esto está volviendo ahora. Cuando dices “otras cosas” que debería hacer para hacerlas útiles para producción, ¿hay algo más que debería gritarme “¡HAZ ESTO!” (además de lo obvio de cambiar el número de puerto del mismo 6666 en cada una de las instancias de docker)?

OK. Entonces, para las claves de API separadas por tubería, ¿son completamente arbitrarias como el host del servicio y simplemente especificamos las claves alfanuméricas que queremos aceptar del cliente?

¿Cómo es que cambiar el puerto es menos “obvio” que hacerlo funcionar en segundo plano?

Esa es la cuestión. Sin tener un conocimiento íntimo de lo que consideras obvio, es imposible responder a la pregunta. Mayormente, si no estás bastante seguro de saber cómo hacer que las cosas sean útiles, entonces probablemente necesites ayuda que no puedes obtener aquí. :person_shrugging:

Porque he ejecutado docenas de contenedores de Docker en el pasado. Simplemente no he tocado Docker en los últimos dos años y me he sumergido profundamente. No fue obvio al principio, ya que no lo había tocado en mucho tiempo, pero este conocimiento fundamental básico para usar Docker volvió al discutirlo.

Esa es la cuestión. Sin tener un conocimiento íntimo de lo que usted considera obvio, es imposible responder a la pregunta. Mayormente, si no está bastante seguro de saber cómo hacer que las cosas sean útiles, entonces probablemente necesite ayuda que no puede obtener aquí. :person_shrugging:

Esa es la dificultad, sin embargo. A veces, lo obvio no es obvio ni siquiera para aquellos que tienen experiencia con diferentes sistemas de Docker como yo. Uno podría interpretar lo que usted dijo como, usted debería saber la respuesta a la pregunta antes de hacerla. Entienda que algunos de nosotros administramos comunidades como un servicio voluntario y no pasamos 24 horas al día, 7 días a la semana, aprendiendo los detalles más íntimos de Discourse hasta las estructuras de datos de Postgres y demás. Siento que me estaba cerrando la puerta y eso no fue apreciado en lo que debería ser un foro comunitario donde todos deberían ayudarse mutuamente de forma libre y feliz.

Al grano, he buscado en Google para tratar de determinar cómo se supone que se deben utilizar las API_KEYS y no he tenido éxito. Entiendo que puedo estar perdiéndome lo obvio y que eso puede ser francamente frustrante para un profesional de Discourse como usted con un amplio conocimiento de la plataforma hasta el nivel más bajo, pero estoy tratando de tener una discusión comunitaria aquí para que otros que no están necesariamente a su nivel de habilidad todavía puedan beneficiarse. Después de todo, el objetivo es que personas distintas a los desarrolladores de Discourse puedan usar este software también.

1 me gusta

Siento tu dolor. Encontrarme con algún servicio que tengo en ejecución y tener poca idea de cómo lo inicié sucede más de lo que me gustaría.

Correcto. Incluso las instrucciones que escribimos para nosotros mismos no tienen sentido cuando las necesitamos.

Lo siento. No quise ser grosero ni malintencionado, y parece que lo fui. Mi punto era simplemente que ya es bastante difícil dar soporte a personas que ejecutan la Instalación Estándar, por lo que averiguar cuáles son tus habilidades y cómo planeas lanzarlo y si estará en Internet abierto y si sabes cómo o quieres que esté protegido con https (probablemente sí si crees que lo estás protegiendo con claves API), es difícil.

Sí. Si vas a poner esto en algún lugar donde otra persona pueda contactarlo, creo que querrás definir esa variable API_KEYS y encontrar alguna forma de generar algo más o menos aleatorio para usar como clave. Y luego ingresarías la misma clave en la configuración del plugin. Eso es lo que hice. No comprobé que usar la clave incorrecta lo rompería, lo que, sinceramente, creo que debería haber hecho. Quizás lo haga en la instancia a la que estoy a punto de agregar el plugin.

Pero podría ser mejor si el OP incluyera el -d y estableciera la variable de entorno API_KEYS.

1 me gusta

la perilla de entorno API_KEYS es opcional y puede usarla si, por alguna razón, desea restringir el servicio solo a los clientes que proporcionan una de las API_KEYS configuradas en su encabezado.

Algo que realmente no necesita si lo ejecuta internamente para una sola instancia, pero que puede ser útil si lo ejecuta a través de Internet o en un entorno compartido.

3 Me gusta

Gracias @Falco y @pfaffman por su ayuda y ¡perdón si descarrilé las cosas aquí! ¡Ambos han sido de gran ayuda! :smiley:

2 Me gusta

¿Se pueden usar todos estos servicios en múltiples instalaciones de Discourse o deben ejecutarse por sitio?

1 me gusta

Todos son seguros para compartir entre instancias.

2 Me gusta

¿Todavía es posible usar la resumen con claves de API de OpenAI?

Sí, rellena las claves y elige un modelo de OpenAI en la configuración de resumen.

1 me gusta

Hay un pequeño problema si ese tema utiliza un idioma que no sea el inglés o uno menor: una vez utiliza el idioma correcto y de repente empieza a utilizar el inglés. De cualquier manera, el cambio de idioma parece ocurrir de forma totalmente aleatoria.

Estoy probando el endpoint de Resumen:

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

Sin embargo, cuando lo ejecuto, obtengo el siguiente error. Esta máquina tiene (2) Tesla T4 y ningún otro proceso está accediendo a las GPUs. Ver uso a continuación.

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 después de que el modelo falla.

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                                                 |
+-----------------------------------------------------------------------------+

Cuando inicio el modelo, veo que el uso de la GPU aumenta a aproximadamente el 100% en ambas GPUs, y luego falla.

Dos T4 son muy pocos para ese modelo. Puedes probar algo como un modelo compatible de 7B en esos.

2 Me gusta

Pude ejecutar el siguiente modo en un 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

Puedo probarlo localmente y 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.\"}

Sin embargo, cuando intento ejecutarlo en Discourse, con esta configuración

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

Recibo el siguiente error.

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'

Necesitas configurar la URL de ese servicio en ai_hugging_face_api_url

Parece que las estrategias de resumen disponibles no admiten el modelo que estoy ejecutando.

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

Solo me pregunto si instalas y ejecutas el servicio de clasificación de toxicidad, ¿cómo lo desactivas o desinstalas correctamente? Gracias.