Discourse AI - Selbstgehosteter Leitfaden

Gibt es einen bestimmten Grund, warum diese Docker-Befehle nicht im Detached-Modus ausgeführt werden (es fehlt -d)?

Wenn Sie meinen „Sollte ich diese nicht mit -d starten?“ lautet die Antwort wahrscheinlich ja.

Wenn Sie wirklich meinen „Warum hat der OP mir nicht gesagt, diese Befehle mit -d zu starten?“, denke ich, dass sie als Beispiele dafür gedacht sind, wie man sie starten und überhaupt zum Laufen bringen kann. In der Praxis werden Sie einige \u003canderes Zeug\u003e tun wollen, um sie auf eine Weise zu starten, die sie in der Produktion nützlich macht.

3 „Gefällt mir“

Das ist genau meine Frage und Sie haben den Nagel auf den Kopf getroffen. Es ist eine Weile her, seit ich meine Docker-Instanzen konfiguriert habe, aber das kommt jetzt wieder. Wenn Sie „anderes Zeug“ sagen, das ich tun sollte, um sie für die Produktion nützlich zu machen, gibt es noch etwas, das mir „TU DAS!“ schreien sollte (abgesehen von der offensichtlichen Änderung der Portnummer von denselben 6666 in jeder der Docker-Instanzen)?

OK. Sind diese durch Pipe getrennten API-Schlüssel völlig beliebig, wie der Service-Host, und geben wir einfach die alphanumerischen Schlüssel an, die wir vom Client akzeptieren möchten?

Wie ist die Änderung des Ports weniger “offensichtlich” als die Ausführung im Hintergrund?

Das ist der Punkt. Ohne intimes Wissen darüber, was Sie für offensichtlich halten, ist es unmöglich, die Frage zu beantworten. Meistens, wenn Sie sich nicht ziemlich sicher sind, dass Sie wissen, wie Sie die Dinge nützlich machen können, dann brauchen Sie wahrscheinlich Hilfe, die Sie hier nicht bekommen können. :person_shrugging:

Da ich in der Vergangenheit Dutzende von Docker-Containern ausgeführt habe. Ich habe Docker in den letzten zwei Jahren nicht mehr angefasst und bin tief eingetaucht. Es war nicht sofort offensichtlich, da ich es eine Weile nicht mehr angefasst hatte, aber dieses grundlegende Wissen für die Verwendung von Docker kam nach der Diskussion wieder zurück.

Das ist der Punkt. Ohne intimes Wissen darüber zu haben, was Sie für offensichtlich halten, ist es unmöglich, die Frage zu beantworten. Meistens, wenn Sie sich nicht ziemlich sicher sind, wie Sie die Dinge nützlich machen können, dann brauchen Sie wahrscheinlich Hilfe, die Sie hier nicht bekommen können. :person_shrugging:

Das ist aber der Haken. Manchmal ist das Offensichtliche nicht offensichtlich, selbst für diejenigen mit Erfahrung in verschiedenen Docker-Systemen wie mir. Man könnte das, was Sie gesagt haben, so interpretieren, dass man die Antwort auf die Frage kennen sollte, bevor man sie stellt. Verstehen Sie, dass einige von uns Gemeinschaften als ehrenamtlichen Dienst betreiben und nicht 24/7 damit verbringen, die intimsten Details von Discourse bis hin zu den Postgres-Datenstrukturen usw. zu lernen. Ich habe das Gefühl, Sie haben mich abgewiesen, und das wurde in einem Community-Forum, in dem sich alle frei und glücklich gegenseitig helfen sollten, nicht geschätzt.

Um auf den Punkt zu kommen: Ich habe einiges gegoogelt, um herauszufinden, wie API_KEYS verwendet werden soll, und bin nicht fündig geworden. Ich verstehe, dass ich vielleicht das Offensichtliche übersehe und das für einen Discourse-Profi wie Sie mit umfassenden Kenntnissen der Plattform bis auf die unterste Ebene hinunter äußerst frustrierend sein mag, aber ich versuche hier eine Community-Diskussion zu führen, damit auch andere, die nicht unbedingt auf Ihrem Niveau sind, davon profitieren können. Schließlich geht es darum, dass auch andere als die Entwickler von Discourse diese Software nutzen können.

1 „Gefällt mir“

Ich fühle mit dir. Auf einen Dienst zu stoßen, den ich laufen habe und wenig Ahnung habe, wie ich ihn gestartet habe, passiert öfter, als mir lieb ist.

Richtig. Selbst Anweisungen, die wir für uns selbst schreiben, ergeben keinen Sinn, wenn wir sie brauchen.

Entschuldigung. Ich wollte nicht unhöflich oder gemein sein, und es sieht so aus, als wäre ich es gewesen. Mein Punkt war nur, dass es schon schwierig genug ist, Leute zu unterstützen, die die Standardinstallation ausführen. Daher ist es schwierig herauszufinden, welche Fähigkeiten du hast, wie du es starten willst, ob es im offenen Internet laufen wird und ob du weißt, wie du es mit https schützen kannst oder willst (wahrscheinlich schon, wenn du denkst, dass du es mit API-Schlüsseln schützt).

Ja. Wenn du das irgendwo platzierst, wo jemand anderes damit Kontakt aufnehmen kann, denke ich, dass du die Variable API_KEYS definieren und eine Möglichkeit finden willst, etwas Zufälliges als Schlüssel zu generieren. Und dann würdest du denselben Schlüssel in den Einstellungen des Plugins eingeben. Das habe ich getan. Ich habe nicht überprüft, ob die Verwendung des falschen Schlüssels es kaputt machen würde, was ich ehrlich gesagt hätte tun sollen. Vielleicht mache ich das bei der Instanz, zu der ich das Plugin gerade hinzufüge.

Aber es wäre vielleicht besser, wenn der OP die -d Option einschließt und die Umgebungsvariable API_KEYS setzt.

1 „Gefällt mir“

Der API_KEYS-Umgebungsregler ist eine optionale Einstellung, die Sie verwenden können, wenn Sie den Dienst aus irgendeinem Grund auf Clients beschränken möchten, die einen der konfigurierten API_KEYS in ihrem Header angeben.

Etwas, das Sie nicht wirklich benötigen, wenn Sie ihn intern für eine einzelne Instanz ausführen, aber das nützlich sein kann, wenn Sie ihn über das Internet oder in einer gemeinsam genutzten Umgebung ausführen.

3 „Gefällt mir“

Danke @Falco und @pfaffman für eure Hilfe und sorry, falls ich hier vom Thema abgekommen bin! Eure Hilfe war sehr geschätzt! :smiley:

2 „Gefällt mir“

Können alle diese Dienste von mehreren Discourse-Installationen genutzt werden, oder sollten diese pro Website ausgeführt werden?

1 „Gefällt mir“

Sie sind alle sicher für die gemeinsame Nutzung zwischen Instanzen.

2 „Gefällt mir“

Ist es immer noch möglich, die Zusammenfassung mit OpenAI API-Schlüsseln zu verwenden?

Ja, füllen Sie die Schlüssel aus und wählen Sie ein OpenAI-Modell in den Zusammenfassungseinstellungen.

1 „Gefällt mir“

Es gibt ein kleines Problem, wenn das Thema eine andere Sprache als Englisch oder eine kleinere verwendet – es verwendet einmal die richtige Sprache und plötzlich beginnt es, Englisch zu verwenden. Beide Arten der Sprachänderung scheinen völlig zufällig zu geschehen.

Ich teste den Summarization-Endpunkt:

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

Wenn ich ihn jedoch ausführe, erhalte ich die folgende Fehlermeldung. Diese Maschine verfügt über (2) Tesla T4s und kein anderer Prozess greift auf die GPUs zu. Siehe Nutzung unten.

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 nach dem Absturz des Modells.

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

Wenn ich das Modell starte, sehe ich, wie die GPU-Auslastung auf beiden GPUs auf etwa 100 % ansteigt und es dann abstürzt.

Zwei T4 sind viel zu wenig für dieses Modell. Sie können etwas wie ein kompatibles 7B-Modell für Prompts ausprobieren.

2 „Gefällt mir“

Ich konnte den folgenden Modus auf einer T4 ausführen

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

Ich kann es lokal testen und es funktioniert:

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.\"}

Wenn ich versuche, es in Discourse mit diesen Einstellungen auszuführen

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

erhalte ich die folgende Fehlermeldung.

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'

Sie müssen die URL dieses Dienstes unter ai_hugging_face_api_url festlegen.

Es scheint, dass die verfügbaren Zusammenfassungsstrategien das von mir ausgeführte Modell nicht unterstützen.

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

Ich frage mich nur, wenn Sie den Toxizitätsklassifizierungsdienst installieren und ausführen, wie Sie ihn deaktivieren oder ordnungsgemäß deinstallieren? Danke