diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index 228e87c..c1717cb 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -16,6 +16,17 @@ jobs: - name: Checkout uses: actions/checkout@v4 + # Depuis que l'image compile whisper.cpp avec CUDA, le build empile + # nvidia/cuda:*-devel (~6 Go), l'image runtime CUDA de llama.cpp (~4 Go) + # et Chromium/Playwright (~1 Go) — pour ~14 Go libres sur un runner neuf. + # Ces trois répertoires ne servent à rien ici et rendent une dizaine de + # gigaoctets en moins d'une minute. + - name: Libérer de l'espace disque + run: | + df -h / + sudo rm -rf /usr/share/dotnet /usr/local/lib/android /opt/ghc + df -h / + - name: Setup Buildx uses: docker/setup-buildx-action@v3 diff --git a/Dockerfile b/Dockerfile index 4299b37..307695a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -64,11 +64,18 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ && rm -rf /var/lib/apt/lists/* RUN git clone --depth 1 https://github.com/ggml-org/whisper.cpp /w \ && cmake -S /w -B /w/build ${WHISPER_CMAKE_FLAGS} \ - && cmake --build /w/build -j --target whisper-server + && cmake --build /w/build -j"$(nproc)" --target whisper-server # Version CUDA. La MAJEURE de CUDA doit correspondre à celle de l'image # runtime : le binaire est lié dynamiquement à libcudart, fournie par # LLAMACPP_IMAGE et non par cette étape. +# +# ⚠️ -j"$(nproc)" et JAMAIS -j nu. Avec Make, « -j » sans nombre autorise un +# parallélisme ILLIMITÉ. ggml-cuda compte ~200 fichiers d'instanciation de +# gabarits, et chaque nvcc réclame 1 à 2 Go : le runner GitHub (16 Go) était +# tué par l'OOM après avoir lancé 92 % des compilations en treize secondes, +# sans écrire la moindre ligne d'erreur. L'étape CPU y survivait — peu de +# fichiers, compilation légère — ce qui rendait le piège invisible jusqu'ici. FROM nvidia/cuda:12.4.1-devel-ubuntu22.04 AS whisperbuild-cuda ARG WHISPER_CMAKE_FLAGS RUN apt-get update && apt-get install -y --no-install-recommends \ @@ -76,7 +83,8 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ && rm -rf /var/lib/apt/lists/* RUN git clone --depth 1 https://github.com/ggml-org/whisper.cpp /w \ && cmake -S /w -B /w/build ${WHISPER_CMAKE_FLAGS} -DGGML_CUDA=ON \ - && cmake --build /w/build -j --target whisper-server + && cmake --build /w/build -j"$(nproc)" --target whisper-server \ + && strip /w/build/bin/whisper-server # ── Étape 2 : runtime sur l'image serveur CUDA officielle ─────────────── FROM ${LLAMACPP_IMAGE} AS runtime diff --git a/internal/loki/web_transcribe_test.go b/internal/loki/web_transcribe_test.go index d4219f0..dd319ee 100644 --- a/internal/loki/web_transcribe_test.go +++ b/internal/loki/web_transcribe_test.go @@ -2,6 +2,7 @@ package loki import ( "os" + "regexp" "strings" "testing" ) @@ -80,6 +81,18 @@ func TestDockerfileWhisperNonNatif(t *testing.T) { if !strings.Contains(txt, "whisper-server") { t.Errorf("étape %s : ne construit pas la cible whisper-server", nom) } + // « -j » nu autorise un parallélisme ILLIMITÉ chez Make. Sur l'étape + // CUDA (~200 nvcc à 1-2 Go pièce), le runner GitHub était tué par + // l'OOM sans écrire une ligne d'erreur. L'étape CPU y survivait, ce + // qui rendait le piège invisible. + for _, ligne := range strings.Split(txt, "\n") { + if !strings.Contains(ligne, "cmake --build") { + continue + } + if regexp.MustCompile(`-j(\s|$|\\)`).MatchString(ligne) { + t.Errorf("étape %s : « cmake --build -j » sans nombre — parallélisme illimité, le runner sera tué par l'OOM. Utiliser -j\"$(nproc)\".", nom) + } + } } }