Merge pull request #20 from R0m1k3/fix/build-cuda-oom

Image : le build CUDA était tué par l'OOM, pas en échec de compilation
This commit is contained in:
LogiFlow authored and GitHub committed 2026-08-21 21:44:47 +02:00
commit 748328db25
3 files changed
+34 -2

No files matched your search

+11
View File
@@ -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
+10 -2
View File
@@ -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
+13
View File
@@ -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)
}
}
}
}