carlex3321 commited on
Commit
ed6879d
·
verified ·
1 Parent(s): 19b79a8

Update builder.sh

Browse files
Files changed (1) hide show
  1. builder.sh +54 -72
builder.sh CHANGED
@@ -1,13 +1,22 @@
1
  #!/usr/bin/env bash
2
  set -euo pipefail
3
 
4
-
5
-
6
-
7
  echo "======================================================="
8
  echo " ADUC-SDR — Builder (Triton + Apex + Q8 + FlashAttention + LayerNorm)"
9
  echo "======================================================="
10
 
 
 
 
 
 
 
 
 
 
 
 
 
11
  # ---------------------- Caches persistentes ----------------------
12
  if [ -d /data ]; then
13
  export HF_HOME="${HF_HOME:-/data/.cache/huggingface}"
@@ -35,12 +44,10 @@ export TORCH_CUDA_ARCH_LIST="${TORCH_CUDA_ARCH_LIST:-8.9}"
35
  export MAX_JOBS="${MAX_JOBS:-$(nproc)}"
36
  export CUDA_HOME="${CUDA_HOME:-/usr/local/cuda}"
37
 
38
- # ---------------------- Dependências de build ----------------------
39
-
40
-
41
 
42
-
43
- # Tags do ambiente
44
  PY_TAG="$(python -c 'import sys; print(f"cp{sys.version_info[0]}{sys.version_info[1]}")' 2>/dev/null || echo cp310)"
45
  TORCH_VER="$(python - <<'PY'
46
  try:
@@ -101,9 +108,7 @@ PY
101
  }
102
 
103
  hf_upload_wheels_if_available() {
104
- # Faz upload de wheels geradas para o repo HF (opcional)
105
- # Requer HF_TOKEN configurado (env)
106
- local pkg_prefix="$1" # ex: triton-
107
  if [ -z "${HF_TOKEN:-}" ]; then
108
  echo "ℹ️ HF_TOKEN não definido; skip upload wheels ${pkg_prefix}"
109
  return 0
@@ -116,10 +121,10 @@ hf_upload_wheels_if_available() {
116
  fi
117
  echo "☁️ Enviando wheels ${pkg_prefix}* para HF repo ${SELF_HF_REPO_ID} ..."
118
  python - <<'PY'
119
- import os
120
  from huggingface_hub import HfApi, HfFolder
121
- repo=os.environ.get("SELF_HF_REPO_ID","carlex3321/aduc-sdr")
122
- token=os.getenv("HF_TOKEN") or HfFolder.get_token()
123
  if not token:
124
  raise SystemExit(0)
125
  api=HfApi(token=token)
@@ -183,37 +188,20 @@ raise SystemExit(0 if ok else 1)
183
  PY
184
  }
185
 
186
- check_flash_layer_norm_wheel() {
187
- python - <<'PY'
188
- ok=False
189
- try:
190
- import importlib
191
- # tenta símbolos típicos do LN nativo
192
- for name in ("flash_attn.ops.layer_norm","flash_attn.layers.layer_norm"):
193
- try:
194
- m=importlib.import_module(name)
195
- ok=True; break
196
- except Exception:
197
- pass
198
- except Exception:
199
- ok=False
200
- raise SystemExit(0 if ok else 1)
201
- PY
202
- }
203
-
204
  # ---------------------- Builders ----------------------
 
 
 
205
  build_triton() {
206
  echo "🔧 build_triton — preparando"
207
  rm -rf /app/wheels/src/triton
208
- git clone --depth 1 https://github.com/openai/triton.git /app/wheels/src/triton
209
- # Sugeridos (opcional):
210
- export TRITON_BUILD_WITH_CLANG_LLD=true
211
- export TRITON_BUILD_WITH_CCACHE=true
212
- export TRITON_HOME=/app/.triton
213
  pushd /app/wheels/src/triton >/dev/null
 
214
  pip wheel --no-build-isolation --no-deps . -w /app/wheels || true
215
  popd >/dev/null
216
- use_wheel_or_build "triton-*.whl" "/app/wheels/src/triton" "pip install --no-build-isolation /app/wheels/src/triton"
 
217
  hf_upload_wheels_if_available "triton-"
218
  echo "✅ build_triton — OK"
219
  }
@@ -258,10 +246,6 @@ build_flash () {
258
  rm -rf "$SRC"
259
  git clone --depth 1 --branch "$FLASH_ATTENTION_TAG" https://github.com/Dao-AILab/flash-attention.git "$SRC"
260
 
261
- export TORCH_CUDA_ARCH_LIST="${TORCH_CUDA_ARCH_LIST:-8.9}"
262
- export MAX_JOBS="${MAX_JOBS:-$(nproc)}"
263
- export CUDA_HOME="${CUDA_HOME:-/usr/local/cuda}"
264
-
265
  # 1) Pacote principal
266
  python -m pip wheel --no-build-isolation --no-deps "$SRC" -w /app/wheels || true
267
  local W_MAIN="$(ls -t /app/wheels/flash_attn-*.whl 2>/dev/null | head -n1 || true)"
@@ -271,24 +255,28 @@ build_flash () {
271
  python -m pip install --no-build-isolation "$SRC" || true
272
  fi
273
 
274
- # 2) Submódulo attn/csrc/layer_norm — empacotar e instalar
275
- echo "🔧 flash-attn layer_norm — build wheel de csrc/layer_norm"
276
- local LN_SRC="$SRC/attn/csrc/layer_norm"
 
 
 
277
  if [ -d "$LN_SRC" ]; then
278
- if [ -f "$LN_SRC/setup.py" ] || [ -f "$LN_SRC/pyproject.toml" ]; then
279
- python -m pip wheel --no-build-isolation --no-deps "$LN_SRC" -w /app/wheels || true
280
- local W_LN="$(ls -t /app/wheels/*layer*norm*whl /app/wheels/flash_attn_layer_norm-*.whl 2>/dev/null | head -n1 || true)"
281
- if [ -n "${W_LN}" ]; then
282
- python -m pip install -U --no-deps "${W_LN}" || true
283
- else
284
- pip install --no-build-isolation "$LN_SRC" || true
285
- fi
286
  else
287
- # fallback simples se não houver metadados de build locais
288
- pip install --no-build-isolation "$LN_SRC" || true
 
 
289
  fi
 
290
  else
291
- echo "ℹ️ Diretório $LN_SRC não encontrado na tag $FLASH_ATTENTION_TAG; seguindo."
292
  fi
293
 
294
  hf_upload_wheels_if_available "flash_attn-"
@@ -322,26 +310,15 @@ ensure_pkg () {
322
  }
323
 
324
  # ---------------------- Execução ----------------------
325
- # Ordem recomendada: Triton -> Apex -> Q8 -> FlashAttention (+ layer_norm) -> BitsAndBytes
326
- #ensure_pkg "triton" check_triton
327
- #build_triton
328
- #|| true
329
- #ensure_pkg "apex" check_apex build_apex || true
330
- #ensure_pkg "q8_kernels" check_q8 build_q8 || true
331
- #ensure_pkg "flash_attn" check_flash build_flash || true
332
 
333
  # opcional
334
- build_triton
335
- build_apex
336
- build_flash
337
- build_q8
338
  build_bitsandbytes
339
 
340
- check_triton
341
- check_apex
342
- check_q8
343
- check_flash
344
-
345
  echo "======================================================="
346
  echo " Build concluído. Resumo de módulos:"
347
  python - <<'PY'
@@ -358,6 +335,11 @@ try:
358
  print(" - apex.normalization: OK")
359
  except Exception as e:
360
  print(" - apex.normalization: FAIL ->", e)
 
 
 
 
 
361
  PY
362
  echo "======================================================="
363
  echo " ✔️ Builder finalizado."
 
1
  #!/usr/bin/env bash
2
  set -euo pipefail
3
 
 
 
 
4
  echo "======================================================="
5
  echo " ADUC-SDR — Builder (Triton + Apex + Q8 + FlashAttention + LayerNorm)"
6
  echo "======================================================="
7
 
8
+ # ---------------------- Toolchain p/ compilar ----------------------
9
+ if command -v apt-get >/dev/null 2>&1; then
10
+ apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y \
11
+ build-essential clang lld cmake ninja-build git python3-dev \
12
+ && rm -rf /var/lib/apt/lists/*
13
+ fi
14
+ export CC="${CC:-clang}"
15
+ export CXX="${CXX:-clang++}"
16
+ export LD="${LD:-lld}"
17
+
18
+ chmod -R 777 /app/wheels /app/whells || true
19
+
20
  # ---------------------- Caches persistentes ----------------------
21
  if [ -d /data ]; then
22
  export HF_HOME="${HF_HOME:-/data/.cache/huggingface}"
 
44
  export MAX_JOBS="${MAX_JOBS:-$(nproc)}"
45
  export CUDA_HOME="${CUDA_HOME:-/usr/local/cuda}"
46
 
47
+ # ---------------------- Base Python deps ----------------------
48
+ python -m pip install -U pip setuptools wheel build cmake ninja packaging "huggingface_hub[hf_transfer]" || true
 
49
 
50
+ # ---------------------- Identificadores de ambiente ----------------------
 
51
  PY_TAG="$(python -c 'import sys; print(f"cp{sys.version_info[0]}{sys.version_info[1]}")' 2>/dev/null || echo cp310)"
52
  TORCH_VER="$(python - <<'PY'
53
  try:
 
108
  }
109
 
110
  hf_upload_wheels_if_available() {
111
+ local pkg_prefix="$1"
 
 
112
  if [ -z "${HF_TOKEN:-}" ]; then
113
  echo "ℹ️ HF_TOKEN não definido; skip upload wheels ${pkg_prefix}"
114
  return 0
 
121
  fi
122
  echo "☁️ Enviando wheels ${pkg_prefix}* para HF repo ${SELF_HF_REPO_ID} ..."
123
  python - <<'PY'
124
+ import os, glob
125
  from huggingface_hub import HfApi, HfFolder
126
+ repo = os.environ.get("SELF_HF_REPO_ID","carlex3321/aduc-sdr")
127
+ token = os.environ.get("HF_TOKEN") or HfFolder.get_token()
128
  if not token:
129
  raise SystemExit(0)
130
  api=HfApi(token=token)
 
188
  PY
189
  }
190
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
191
  # ---------------------- Builders ----------------------
192
+ TRITON_REPO="${TRITON_REPO:-https://github.com/openai/triton.git}"
193
+ TRITON_REF="${TRITON_REF:-main}"
194
+
195
  build_triton() {
196
  echo "🔧 build_triton — preparando"
197
  rm -rf /app/wheels/src/triton
198
+ git clone --depth 1 --branch "$TRITON_REF" "$TRITON_REPO" /app/wheels/src/triton
 
 
 
 
199
  pushd /app/wheels/src/triton >/dev/null
200
+ # Tentar wheel offline (gera cache reusável); se falhar, instala editable
201
  pip wheel --no-build-isolation --no-deps . -w /app/wheels || true
202
  popd >/dev/null
203
+ use_wheel_or_build "triton-*.whl" "/app/wheels/src/triton" "pip install --no-build-isolation -e /app/wheels/src/triton || pip install --no-build-isolation /app/wheels/src/triton"
204
+ # Upload opcional (se wheel existir)
205
  hf_upload_wheels_if_available "triton-"
206
  echo "✅ build_triton — OK"
207
  }
 
246
  rm -rf "$SRC"
247
  git clone --depth 1 --branch "$FLASH_ATTENTION_TAG" https://github.com/Dao-AILab/flash-attention.git "$SRC"
248
 
 
 
 
 
249
  # 1) Pacote principal
250
  python -m pip wheel --no-build-isolation --no-deps "$SRC" -w /app/wheels || true
251
  local W_MAIN="$(ls -t /app/wheels/flash_attn-*.whl 2>/dev/null | head -n1 || true)"
 
255
  python -m pip install --no-build-isolation "$SRC" || true
256
  fi
257
 
258
+ # 2) Submódulo attn/csrc/layer_norm — gerar e instalar wheel
259
+ echo "🔧 flash-attn layer_norm — build wheel"
260
+ local LN_SRC="$SRC/csrc/layer_norm"
261
+ if [ ! -d "$LN_SRC" ]; then
262
+ LN_SRC="$SRC/attn/csrc/layer_norm"
263
+ fi
264
  if [ -d "$LN_SRC" ]; then
265
+ pushd "$LN_SRC" >/dev/null
266
+ pip wheel --no-build-isolation --no-deps . -w /app/wheels || pip wheel --use-pep517 --no-deps . -w /app/wheels || true
267
+ popd >/dev/null
268
+ local W_LN="$(ls -t /app/wheels/dropout_layer_norm-*.whl 2>/dev/null | head -n1 || true)"
269
+ if [ -n "${W_LN}" ]; then
270
+ python -m pip install -U --no-deps "${W_LN}" || true
 
 
271
  else
272
+ echo "⚠️ Wheel dropout_layer_norm não encontrada, instalando do source (PEP 517 se possível)"
273
+ pushd "$LN_SRC" >/dev/null
274
+ pip install --use-pep517 --no-build-isolation . || pip install .
275
+ popd >/dev/null
276
  fi
277
+ hf_upload_wheels_if_available "dropout_layer_norm-"
278
  else
279
+ echo "ℹ️ Diretório de layer_norm não encontrado (tag ${FLASH_ATTENTION_TAG})."
280
  fi
281
 
282
  hf_upload_wheels_if_available "flash_attn-"
 
310
  }
311
 
312
  # ---------------------- Execução ----------------------
313
+ build_triton
314
+ ensure_pkg "triton" check_triton build_triton || true
315
+ ensure_pkg "apex" check_apex build_apex || true
316
+ ensure_pkg "q8_kernels" check_q8 build_q8 || true
317
+ ensure_pkg "flash_attn" check_flash build_flash || true
 
 
318
 
319
  # opcional
 
 
 
 
320
  build_bitsandbytes
321
 
 
 
 
 
 
322
  echo "======================================================="
323
  echo " Build concluído. Resumo de módulos:"
324
  python - <<'PY'
 
335
  print(" - apex.normalization: OK")
336
  except Exception as e:
337
  print(" - apex.normalization: FAIL ->", e)
338
+ try:
339
+ import dropout_layer_norm
340
+ print(" - dropout_layer_norm: OK")
341
+ except Exception as e:
342
+ print(" - dropout_layer_norm: FAIL ->", e)
343
  PY
344
  echo "======================================================="
345
  echo " ✔️ Builder finalizado."