Uploaded sanitized BC250/ROCm Repository.

This commit is contained in:
Fabian
2026-08-20 00:45:43 +02:00
parent 7d2184f1e8
commit d7d22e93b3
678 changed files with 65963 additions and 1 deletions
+4
View File
@@ -0,0 +1,4 @@
import torch
print("Device props:", torch.cuda.get_device_properties(0))
print("Arch list:", torch.cuda.get_arch_list())
print("GCN arch:", torch.cuda.get_device_properties(0).gcnArchName if hasattr(torch.cuda.get_device_properties(0), 'gcnArchName') else 'N/A')
+58
View File
@@ -0,0 +1,58 @@
#!/bin/bash
set -e
echo "============================================"
echo " PyTorch 2.5.1 Build for gfx1010 (BC-250)"
echo "============================================"
cd ~/pytorch-build
# --- Phase 1: Clean old partial build ---
echo "[Phase 1] Cleaning old build artifacts..."
rm -rf build dist
python3.11 -m pip install --user numpy pyyaml typing-extensions cffi 2>/dev/null || true
echo "[Phase 1] Done."
# --- Phase 2: Environment ---
echo "[Phase 2] Setting environment..."
export HSA_OVERRIDE_GFX_VERSION=10.1.0
export HSA_ENABLE_SDMA=0
export HIP_VISIBLE_DEVICES=0
export ROCM_PATH=/opt/rocm
export PATH="/opt/rocm/bin:$PATH"
export LD_LIBRARY_PATH="/opt/rocm/lib:$LD_LIBRARY_PATH"
# PyTorch build config — minimal build for inference
export USE_ROCM=1
export USE_CUDA=0
export USE_NCCL=0
export USE_DISTRIBUTED=0
export USE_MKLDNN=0
export USE_FBGEMM=0
export USE_NNPACK=0
export USE_QNNPACK=0
export USE_XNNPACK=0
export USE_KINETO=0
export BUILD_TEST=0
export BUILD_CAFFE2=0
export USE_NUMPY=1
export PYTORCH_ROCM_ARCH="gfx1010"
export HIP_PATH=/opt/rocm
export ROCM_SOURCE_DIR=/opt/rocm
export CMAKE_PREFIX_PATH=/opt/rocm
export MAX_JOBS=8
export CMAKE_POLICY_VERSION_MINIMUM=3.5
echo " PYTORCH_ROCM_ARCH=$PYTORCH_ROCM_ARCH"
echo " MAX_JOBS=$MAX_JOBS"
echo "[Phase 2] Done."
# --- Phase 3: Build ---
echo "[Phase 3] Starting PyTorch build..."
python3.11 setup.py bdist_wheel 2>&1 | tee ~/pytorch-build-progress.log
echo ""
echo "============================================"
echo " BUILD COMPLETE"
echo "============================================"
ls -lh dist/*.whl 2>/dev/null || echo "ERROR: No wheel produced!"
+62
View File
@@ -0,0 +1,62 @@
#!/bin/bash
set -e
echo "============================================"
echo " PyTorch 2.5.1 Build for gfx1010 (BC-250)"
echo " NO TRITON / NO AOTRITON"
echo "============================================"
cd ~/pytorch-build
# --- Phase 1: Clean old build ---
echo "[Phase 1] Cleaning old build..."
rm -rf build dist
echo "[Phase 1] Done."
# --- Phase 2: Environment ---
echo "[Phase 2] Setting environment..."
export HSA_OVERRIDE_GFX_VERSION=10.1.0
export HSA_ENABLE_SDMA=0
export HIP_VISIBLE_DEVICES=0
export ROCM_PATH=/opt/rocm
export PATH="/opt/rocm/bin:/home/fabian/.local/bin:$PATH"
export LD_LIBRARY_PATH="/opt/rocm/lib:$LD_LIBRARY_PATH"
# PyTorch build config — minimal for inference, NO Triton
export USE_ROCM=1
export USE_CUDA=0
export USE_NCCL=0
export USE_DISTRIBUTED=0
export USE_MKLDNN=0
export USE_FBGEMM=0
export USE_NNPACK=0
export USE_QNNPACK=0
export USE_XNNPACK=0
export USE_KINETO=0
export BUILD_TEST=0
export BUILD_CAFFE2=0
export USE_NUMPY=1
export USE_AOTRITON=0
export USE_TRITON=0
export PYTORCH_ROCM_ARCH="gfx1010"
export HIP_PATH=/opt/rocm
export ROCM_SOURCE_DIR=/opt/rocm
export CMAKE_PREFIX_PATH=/opt/rocm
export MAX_JOBS=8
export CMAKE_POLICY_VERSION_MINIMUM=3.5
echo " PYTORCH_ROCM_ARCH=$PYTORCH_ROCM_ARCH"
echo " USE_AOTRITON=0 USE_TRITON=0"
echo " MAX_JOBS=$MAX_JOBS"
echo "[Phase 2] Done."
# --- Phase 3: Build ---
echo "[Phase 3] Starting PyTorch build at $(date)..."
python3.11 setup.py bdist_wheel 2>&1 | tee ~/pytorch-build-progress.log
echo ""
echo "============================================"
echo " BUILD FINISHED at $(date)"
echo "============================================"
ls -lh dist/*.whl 2>/dev/null || echo "ERROR: No wheel produced!"
+84
View File
@@ -0,0 +1,84 @@
#!/bin/bash
# =============================================================
# PyTorch 2.5.1 Build for AMD BC-250 — native gfx1010 target
# ROCm 7.2 on CachyOS
# =============================================================
set -euo pipefail
echo "=========================================="
echo " PyTorch Build — gfx1010 for BC-250"
echo "=========================================="
# ========== PHASE 1: Clone ==========
if [ ! -d ~/pytorch-build ]; then
echo "[1/5] Cloning PyTorch v2.5.1 (full recursive)..."
cd ~
git clone --recursive --branch v2.5.1 https://github.com/pytorch/pytorch.git pytorch-build
else
echo "[1/5] Source already exists, skipping clone"
fi
cd ~/pytorch-build
# ========== PHASE 2: Venv + deps ==========
echo "[2/5] Installing build dependencies..."
source ~/ComfyUI/venv/bin/activate
pip install -q cmake ninja pyyaml typing-extensions numpy setuptools wheel cffi
# ========== PHASE 3: Hipify ==========
echo "[3/5] Running hipify (CUDA → HIP conversion)..."
python tools/amd_build/build_amd.py
# ========== PHASE 4: Environment ==========
echo "[4/5] Configuring build environment..."
# ROCm paths
export ROCM_PATH=/opt/rocm
export HIP_PATH=/opt/rocm
export ROCM_HOME=/opt/rocm
export PATH="/opt/rocm/bin:/opt/rocm/llvm/bin:$PATH"
export LD_LIBRARY_PATH="/opt/rocm/lib:${LD_LIBRARY_PATH:-}"
# Target gfx1010 (RDNA1 — closest supported arch for BC-250 gfx1013)
export PYTORCH_ROCM_ARCH="gfx1010"
export AMDGPU_TARGETS="gfx1010"
# Build config
export USE_ROCM=1
export USE_CUDA=0
export USE_CUDNN=0
export USE_NCCL=0
export USE_DISTRIBUTED=0
export USE_MKLDNN=1
export USE_OPENMP=1
export BUILD_TEST=0
export USE_FLASH_ATTENTION=0
export USE_MEM_EFF_ATTENTION=0
export REL_WITH_DEB_INFO=0
export CMAKE_BUILD_TYPE=Release
export CMAKE_POLICY_VERSION_MINIMUM=3.5
# Parallelism — 12 cores, 14GB RAM, be conservative
export MAX_JOBS=4
export NINJA_STATUS="[%f/%t %e] "
# Compiler
export CC=gcc
export CXX=g++
echo " PYTORCH_ROCM_ARCH=$PYTORCH_ROCM_ARCH"
echo " MAX_JOBS=$MAX_JOBS"
echo " ROCM_PATH=$ROCM_PATH"
echo " Python: $(python --version)"
# ========== PHASE 5: Build ==========
echo "[5/5] Building PyTorch wheel..."
echo " Start: $(date)"
python setup.py bdist_wheel
echo ""
echo "=========================================="
echo " Build complete: $(date)"
echo "=========================================="
ls -lh dist/*.whl 2>/dev/null || echo "ERROR: No wheel found!"
@@ -0,0 +1,140 @@
#!/bin/bash
set -e
exec > >(tee -a ~/pytorch-build.log) 2>&1
echo "=========================================="
echo " PyTorch 2.5.1 Build for BC-250 (gfx1010)"
echo " ROCm 7.2.0 | HIP 7.2 | $(date)"
echo "=========================================="
BUILD_DIR="$HOME/pytorch-build"
ROCM_ARCH="gfx1010"
##############################################
# Phase 1: Fix incomplete clone
##############################################
echo ""
echo "[1/5] Fixing submodules..."
cd "$BUILD_DIR"
# Reset any partial checkouts
git submodule sync --recursive
git submodule update --init --recursive --force --jobs 4 2>&1 || {
echo "WARN: Some submodules failed, retrying one by one..."
git submodule foreach --recursive 'git checkout . 2>/dev/null; true'
git submodule update --init --recursive --force 2>&1 || true
}
echo "Clone/submodule size: $(du -sh "$BUILD_DIR" | cut -f1)"
##############################################
# Phase 2: Install build dependencies
##############################################
echo ""
echo "[2/5] Checking build dependencies..."
for pkg in cmake ninja gcc python3; do
if ! command -v $pkg &>/dev/null; then
echo "ERROR: $pkg not found!"
exit 1
fi
echo " $pkg: $(command -v $pkg)"
done
# Ensure python build deps
pip3 install --user cmake ninja pyyaml typing-extensions setuptools wheel 2>&1 | tail -3
##############################################
# Phase 3: Hipify (CUDA -> HIP conversion)
##############################################
echo ""
echo "[3/5] Running hipify (CUDA -> HIP)..."
cd "$BUILD_DIR"
if [ ! -f "aten/src/ATen/hip" ] || [ ! -d "aten/src/ATen/hip" ]; then
python3 tools/amd_build/build_amd.py 2>&1 | tail -20
echo "Hipify complete."
else
echo "Hipify already done, skipping."
fi
##############################################
# Phase 4: Configure environment
##############################################
echo ""
echo "[4/5] Configuring build environment..."
# ROCm paths
export ROCM_PATH=/opt/rocm
export HIP_PATH=/opt/rocm
export ROCM_HOME=/opt/rocm
export HCC_HOME=/opt/rocm/hcc
export HIP_PLATFORM=amd
# Target architecture
export PYTORCH_ROCM_ARCH="$ROCM_ARCH"
export AMDGPU_TARGETS="$ROCM_ARCH"
# Build configuration
export USE_ROCM=1
export USE_CUDA=0
export USE_NCCL=0
export USE_DISTRIBUTED=0
export USE_MKLDNN=0
export USE_FBGEMM=0
export USE_KINETO=0
export USE_QNNPACK=0
export USE_PYTORCH_QNNPACK=0
export USE_NNPACK=0
export USE_XNNPACK=0
export BUILD_TEST=0
export BUILD_CAFFE2=0
export USE_FLASH_ATTENTION=0
export USE_MEM_EFF_ATTENTION=0
# BC-250 has limited RAM — reduce parallel jobs
export MAX_JOBS=3
# Fix CMake 4.x compatibility
export CMAKE_POLICY_VERSION_MINIMUM=3.5
# Compiler
export CC=gcc
export CXX=g++
export CMAKE_C_COMPILER=gcc
export CMAKE_CXX_COMPILER=g++
# HIP compiler
export HIP_CLANG_PATH=/opt/rocm/llvm/bin
export HIPCC_COMPILE_FLAGS_APPEND="--offload-arch=$ROCM_ARCH"
# BC-250 specific: need managed memory
export HSA_ENABLE_SDMA=0
echo " PYTORCH_ROCM_ARCH=$PYTORCH_ROCM_ARCH"
echo " MAX_JOBS=$MAX_JOBS"
echo " ROCM_PATH=$ROCM_PATH"
echo " Python: $(python3 --version)"
##############################################
# Phase 5: Build
##############################################
echo ""
echo "[5/5] Building PyTorch wheel..."
echo " Start time: $(date)"
cd "$BUILD_DIR"
# Clean any previous build artifacts
python3 setup.py clean 2>/dev/null || true
# Build wheel
python3 setup.py bdist_wheel 2>&1
echo ""
echo "=========================================="
echo " BUILD COMPLETE: $(date)"
echo "=========================================="
ls -lh dist/*.whl 2>/dev/null || echo "ERROR: No wheel file found!"
echo ""
echo "Install with:"
echo " pip install dist/torch-*.whl"
+27
View File
@@ -0,0 +1,27 @@
#!/bin/bash
set -e
source /home/fabian/ComfyUI/venv/bin/activate
export HSA_OVERRIDE_GFX_VERSION=10.1.0
export HSA_ENABLE_SDMA=0
export HIP_VISIBLE_DEVICES=0
export ROCM_PATH=/opt/rocm
export PYTORCH_ROCM_ARCH=gfx1010
export FORCE_CUDA=1
export TORCH_CUDA_ARCH_LIST=""
# Uninstall old torchvision
pip uninstall torchvision -y 2>/dev/null || true
# Clone torchvision matching PyTorch 2.5
cd /tmp
rm -rf torchvision_build
git clone --depth 1 --branch v0.20.0 https://github.com/pytorch/vision.git torchvision_build
cd torchvision_build
# Build and install
python setup.py install 2>&1 | tail -20
echo "=== DONE ==="
python -c "import torchvision; print('torchvision version:', torchvision.__version__)"
+63
View File
@@ -0,0 +1,63 @@
#!/bin/bash
set -e
echo "============================================"
echo " PyTorch 2.5.1 Build for gfx1010 (BC-250)"
echo " NO FLASH/MEM_EFF ATTENTION = NO AOTRITON"
echo "============================================"
cd ~/pytorch-build
# --- Phase 1: Clean ---
echo "[Phase 1] Clean build dir..."
rm -rf build dist
echo "[Phase 1] Done."
# --- Phase 2: Environment ---
echo "[Phase 2] Setting environment..."
export HSA_OVERRIDE_GFX_VERSION=10.1.0
export HSA_ENABLE_SDMA=0
export HIP_VISIBLE_DEVICES=0
export ROCM_PATH=/opt/rocm
export PATH="/opt/rocm/bin:/home/fabian/.local/bin:$PATH"
export LD_LIBRARY_PATH="/opt/rocm/lib:$LD_LIBRARY_PATH"
# PyTorch build config
export USE_ROCM=1
export USE_CUDA=0
export USE_NCCL=0
export USE_DISTRIBUTED=0
export USE_MKLDNN=0
export USE_FBGEMM=0
export USE_NNPACK=0
export USE_QNNPACK=0
export USE_XNNPACK=0
export USE_KINETO=0
export BUILD_TEST=0
export BUILD_CAFFE2=0
export USE_NUMPY=1
# Disable Flash/MemEff attention -> no aotriton dependency
export USE_FLASH_ATTENTION=0
export USE_MEM_EFF_ATTENTION=0
export PYTORCH_ROCM_ARCH="gfx1010"
export HIP_PATH=/opt/rocm
export ROCM_SOURCE_DIR=/opt/rocm
export CMAKE_PREFIX_PATH=/opt/rocm
export MAX_JOBS=8
export CMAKE_POLICY_VERSION_MINIMUM=3.5
echo " PYTORCH_ROCM_ARCH=$PYTORCH_ROCM_ARCH"
echo " USE_FLASH_ATTENTION=0"
echo " USE_MEM_EFF_ATTENTION=0"
echo " MAX_JOBS=$MAX_JOBS"
echo "[Phase 2] Done."
# --- Phase 3: Build ---
echo "[Phase 3] Starting build at $(date)..."
python3.11 setup.py bdist_wheel 2>&1 | tee ~/pytorch-build-progress.log
echo ""
echo "============================================"
echo " BUILD FINISHED at $(date)"
echo "============================================"
ls -lh dist/*.whl 2>/dev/null || echo "ERROR: No wheel produced!"
+48
View File
@@ -0,0 +1,48 @@
#!/bin/bash
# Build v4 - incremental rebuild after C10_WARP_SIZE fix
set -e
cd /home/fabian/pytorch-build
export HSA_OVERRIDE_GFX_VERSION=10.1.0
export HSA_ENABLE_SDMA=0
export HIP_VISIBLE_DEVICES=0
export ROCM_PATH=/opt/rocm
export HIP_PATH=/opt/rocm
export PYTORCH_ROCM_ARCH=gfx1010
export USE_ROCM=1
export USE_CUDA=0
export USE_FLASH_ATTENTION=0
export USE_MEM_EFF_ATTENTION=0
export USE_AOTRITON=0
export USE_TRITON=0
export MAX_JOBS=8
export CMAKE_POLICY_VERSION_MINIMUM=3.5
export CMAKE_PREFIX_PATH=/opt/rocm
export PYTHON_EXECUTABLE=/usr/bin/python3.11
LOG=/home/fabian/pytorch-build/build_v4.log
echo "============================================" | tee "$LOG"
echo " BUILD v4 STARTED at $(date)" | tee -a "$LOG"
echo " Incremental rebuild after C10_WARP_SIZE fix" | tee -a "$LOG"
echo "============================================" | tee -a "$LOG"
# Incremental build - ninja will only recompile changed files
cd build
cmake --build . --target install 2>&1 | tee -a "$LOG"
echo "============================================" | tee -a "$LOG"
echo " BUILD v4 FINISHED at $(date)" | tee -a "$LOG"
echo "============================================" | tee -a "$LOG"
# Back to source root for wheel
cd /home/fabian/pytorch-build
/usr/bin/python3.11 setup.py bdist_wheel 2>&1 | tee -a "$LOG"
WHL=$(ls dist/*.whl 2>/dev/null | head -1)
if [ -n "$WHL" ]; then
echo "SUCCESS: Wheel at $WHL" | tee -a "$LOG"
ls -lh "$WHL" | tee -a "$LOG"
else
echo "ERROR: No wheel produced!" | tee -a "$LOG"
fi
+12
View File
@@ -0,0 +1,12 @@
#!/bin/bash
cd ~/pytorch-build
echo "=== CMakeLists.txt around aotriton ==="
sed -n '855,900p' CMakeLists.txt
echo ""
echo "=== aotriton.cmake ==="
cat cmake/External/aotriton.cmake
echo ""
echo "=== USE_FLASH_ATTENTION in Dependencies ==="
grep -n "FLASH_ATTENTION\|AOTRITON\|aotriton" cmake/Dependencies.cmake 2>/dev/null | head -20
+17
View File
@@ -0,0 +1,17 @@
#!/bin/bash
echo "=== Active build processes ==="
ps aux | grep -E "(build_pytorch|python.*setup|cmake|ninja|make|git.*(clone|submodule))" | grep -v grep | head -10
echo ""
echo "=== Log size ==="
wc -l ~/pytorch-build.log 2>/dev/null
echo ""
echo "=== Last 30 lines of log ==="
tail -30 ~/pytorch-build.log 2>/dev/null
echo ""
echo "=== Build directory status ==="
du -sh ~/pytorch-build 2>/dev/null
ls ~/pytorch-build/build 2>/dev/null && echo "Build dir exists" || echo "Build dir not yet created"
ls ~/pytorch-build/dist/*.whl 2>/dev/null && echo "Wheel found!" || echo "No wheel yet"
+35
View File
@@ -0,0 +1,35 @@
#!/bin/bash
echo "=== OLD BUILD STATE ==="
if [ -d ~/pytorch-build ]; then
echo "Dir exists: $(du -sh ~/pytorch-build)"
ls ~/pytorch-build/
if [ -d ~/pytorch-build/pytorch ]; then
echo "--- PyTorch source dir ---"
ls ~/pytorch-build/pytorch/ | head -20
echo "..."
cd ~/pytorch-build/pytorch
echo "--- Git info ---"
git log --oneline -1 2>/dev/null || echo "Not a git repo"
git describe --tags 2>/dev/null || echo "No tags"
echo "--- Submodule count ---"
git submodule status 2>/dev/null | wc -l
echo "--- Failed submodules ---"
git submodule status 2>/dev/null | grep "^-" | head -10
echo "--- Hipify check ---"
[ -d "aten/src/ATen/hip" ] && echo "Hipify: DONE" || echo "Hipify: NOT DONE"
[ -d "build" ] && echo "Build dir: $(du -sh build)" || echo "No build dir"
ls dist/*.whl 2>/dev/null || echo "No wheel yet"
fi
else
echo "NO pytorch-build dir"
fi
echo "=== DEPS ==="
nproc
cmake --version 2>/dev/null | head -1
ninja --version 2>/dev/null || echo "No ninja"
hipcc --version 2>/dev/null | head -3
python3.11 -c "import numpy; print('numpy:', numpy.__version__)" 2>/dev/null || echo "No numpy"
df -h / | tail -1
echo "=== DONE ==="
+40
View File
@@ -0,0 +1,40 @@
#!/bin/bash
API="http://127.0.0.1:8188"
echo "=== CLIPLoader info ==="
curl -s "$API/object_info/CLIPLoader" | python3.11 -c "
import sys, json
d = json.load(sys.stdin)
info = d.get('CLIPLoader', {})
inp = info.get('input', {})
print(json.dumps(inp, indent=2))
"
echo ""
echo "=== Check what lumina2 expects ==="
curl -s "$API/object_info/CLIPLoader" | python3.11 -c "
import sys, json
d = json.load(sys.stdin)
info = d.get('CLIPLoader', {})
desc = info.get('description', 'N/A')
print('Description:', desc)
out = info.get('output', [])
print('Output:', out)
"
echo ""
echo "=== Check DualCLIPLoader ==="
curl -s "$API/object_info/DualCLIPLoader" | python3.11 -c "
import sys, json
d = json.load(sys.stdin)
info = d.get('DualCLIPLoader', {})
inp = info.get('input', {})
print(json.dumps(inp, indent=2))
"
echo ""
echo "=== Available text_encoder files ==="
ls -lh /home/fabian/ComfyUI/models/text_encoders/
echo ""
echo "=== Available clip files ==="
ls -lh /home/fabian/ComfyUI/models/clip/
+15
View File
@@ -0,0 +1,15 @@
#!/bin/bash
echo "=== ERRORS in build log ==="
grep -iE "error:|FAILED|fatal" ~/pytorch-build-progress.log 2>/dev/null | grep -v "Warnung" | grep -v "Anmerkung" | grep -v "error=return" | grep -v "error=non-virtual" | grep -v "error=range" | grep -v "error=bool" | grep -v "error=format" | grep -v "Werror" | grep -v "error=missing" | tail -30
echo ""
echo "=== LAST 5 LINES of build.log ==="
tail -5 ~/pytorch-build.log
echo ""
echo "=== BUILD DIR SIZE ==="
du -sh ~/pytorch-build/build 2>/dev/null
echo ""
echo "=== WHEEL CHECK ==="
ls ~/pytorch-build/dist/*.whl 2>/dev/null || echo "No wheel"
+35
View File
@@ -0,0 +1,35 @@
#!/bin/bash
API="http://127.0.0.1:8188"
echo "=== GGUF nodes ==="
curl -s "$API/object_info" | python3.11 -c "
import sys, json
d = json.load(sys.stdin)
for k in sorted(d.keys()):
if 'gguf' in k.lower():
print(k)
info = d[k]
if 'input' in info and 'required' in info['input']:
for param, cfg in info['input']['required'].items():
print(f' {param}: {cfg}')
"
echo ""
echo "=== CLIPLoader info ==="
curl -s "$API/object_info/CLIPLoader" | python3.11 -c "
import sys, json
d = json.load(sys.stdin)
if 'CLIPLoader' in d:
info = d['CLIPLoader']
if 'input' in info and 'required' in info['input']:
for param, cfg in info['input']['required'].items():
print(f' {param}: {cfg}')
"
echo ""
echo "=== Model folders ==="
echo "unet:"; ls /home/fabian/ComfyUI/models/unet/ 2>/dev/null
echo "diffusion_models:"; ls /home/fabian/ComfyUI/models/diffusion_models/ 2>/dev/null
echo "text_encoders:"; ls /home/fabian/ComfyUI/models/text_encoders/ 2>/dev/null
echo "clip:"; ls /home/fabian/ComfyUI/models/clip/ 2>/dev/null
echo "vae:"; ls /home/fabian/ComfyUI/models/vae/ 2>/dev/null
+12
View File
@@ -0,0 +1,12 @@
#!/bin/bash
echo "=== Last progress ==="
grep -oP '\[\d+/\d+\]' ~/pytorch-build.log | tail -3
echo ""
echo "=== Process alive? ==="
pgrep -f build_pytorch | head -3
echo ""
echo "=== Last 10 lines ==="
tail -10 ~/pytorch-build.log
echo ""
echo "=== Disk usage ==="
du -sh ~/pytorch-build
+37
View File
@@ -0,0 +1,37 @@
#!/bin/bash
echo "=== ENV ==="
echo "HSA_OVERRIDE=$HSA_OVERRIDE_GFX_VERSION"
echo "SDMA=$HSA_ENABLE_SDMA"
echo "HIP_VIS=$HIP_VISIBLE_DEVICES"
echo "=== RAM ==="
free -m
echo "=== COMFYUI ==="
if [ -f ~/ComfyUI/main.py ]; then echo "ComfyUI: EXISTS"; else echo "ComfyUI: MISSING"; fi
if [ -f ~/ComfyUI/venv/bin/python3.11 ]; then echo "Venv: EXISTS"; else echo "Venv: MISSING"; fi
echo "=== MODELS ==="
ls -lh ~/ComfyUI/models/unet/ 2>/dev/null || echo "NO unet dir"
ls -lh ~/ComfyUI/models/text_encoders/ 2>/dev/null || echo "NO text_encoders dir"
ls -lh ~/ComfyUI/models/vae/ 2>/dev/null || echo "NO vae dir"
echo "=== PYTORCH BUILD ==="
if [ -d ~/pytorch-build ]; then du -sh ~/pytorch-build; else echo "NO BUILD DIR"; fi
echo "=== PYTHON ==="
python3.11 --version 2>/dev/null || echo "NO python3.11"
if [ -f ~/ComfyUI/venv/bin/python ]; then
source ~/ComfyUI/venv/bin/activate
python -c "import torch; print('PyTorch:', torch.__version__); print('CUDA avail:', torch.cuda.is_available()); print('Arch list:', torch.cuda.get_arch_list())" 2>/dev/null || echo "PyTorch import failed"
fi
echo "=== DMESG ==="
sudo dmesg 2>/dev/null | grep -cE "KIQ|GPU died|GPU unreachable" || echo "0"
sudo dmesg 2>/dev/null | grep -c "BC-250" || echo "0"
sudo dmesg 2>/dev/null | grep "BC-250" | head -3
echo "=== CUSTOM NODES ==="
ls ~/ComfyUI/custom_nodes/ 2>/dev/null || echo "NO custom_nodes"
echo "=== DONE ==="
+110
View File
@@ -0,0 +1,110 @@
#!/bin/bash
# Download all models for ComfyUI Z-Image Turbo on BC-250
set -euo pipefail
cd ~/ComfyUI
source venv/bin/activate
pip install -q huggingface-hub safetensors
echo ""
echo "=== Step 1: Download Z-Image Turbo GGUF (5.2 GB) ==="
mkdir -p ~/ComfyUI/models/unet
python3 -c "
from huggingface_hub import hf_hub_download
print('Downloading z_image_turbo-Q5_K_S.gguf from jayn7/Z-Image-Turbo-GGUF ...')
hf_hub_download(
'jayn7/Z-Image-Turbo-GGUF',
'z_image_turbo-Q5_K_S.gguf',
local_dir='/home/fabian/ComfyUI/models/unet'
)
print('Done!')
"
echo ""
echo "=== Step 2: Download Gemma 2 2B Text Encoder shards (9.8 GB) ==="
mkdir -p ~/sd-models/text_encoders/lumina2_gemma2_2b
python3 -c "
from huggingface_hub import hf_hub_download
import os
repo = 'Alpha-VLLM/Lumina-Image-2.0'
dest = '/home/fabian/sd-models/text_encoders/lumina2_gemma2_2b'
os.makedirs(dest, exist_ok=True)
files = [
'text_encoder/config.json',
'text_encoder/model.safetensors.index.json',
'text_encoder/model-00001-of-00003.safetensors',
'text_encoder/model-00002-of-00003.safetensors',
'text_encoder/model-00003-of-00003.safetensors',
]
for f in files:
print(f'Downloading {f}...')
hf_hub_download(repo, f, local_dir=dest)
print('Done!')
"
echo ""
echo "=== Step 3: Merge Text Encoder shards into single safetensors ==="
mkdir -p ~/ComfyUI/models/text_encoders
python3 << 'EOF'
import safetensors.torch
import os, json
base_dir = "/home/fabian/sd-models/text_encoders/lumina2_gemma2_2b/text_encoder"
output = "/home/fabian/ComfyUI/models/text_encoders/gemma2_2b_lumina2.safetensors"
with open(os.path.join(base_dir, "model.safetensors.index.json")) as f:
index = json.load(f)
all_tensors = {}
shards = set(index["weight_map"].values())
print(f"Loading {len(shards)} shards with {len(index['weight_map'])} tensors...")
for shard in sorted(shards):
path = os.path.join(base_dir, shard)
print(f" Loading {shard}...")
tensors = safetensors.torch.load_file(path, device="cpu")
all_tensors.update(tensors)
print(f"Total tensors: {len(all_tensors)}")
print(f"Saving merged file to {output}...")
safetensors.torch.save_file(all_tensors, output)
sz = os.path.getsize(output) / 1e9
print(f"Done! Size: {sz:.2f} GB")
EOF
echo ""
echo "=== Step 4: Download VAE (335 MB) ==="
mkdir -p ~/ComfyUI/models/vae
python3 -c "
from huggingface_hub import hf_hub_download
print('Downloading ae.safetensors ...')
hf_hub_download(
'black-forest-labs/FLUX.1-schnell',
'ae.safetensors',
local_dir='/home/fabian/ComfyUI/models/vae'
)
print('Done!')
"
echo ""
echo "=== Step 5: Download example workflow ==="
mkdir -p ~/ComfyUI/user/default/workflows
python3 -c "
from huggingface_hub import hf_hub_download
hf_hub_download(
'jayn7/Z-Image-Turbo-GGUF',
'example_workflow.json',
local_dir='/home/fabian/ComfyUI/user/default/workflows'
)
print('Workflow downloaded!')
"
echo ""
echo "=== Verification ==="
ls -lh ~/ComfyUI/models/unet/z_image_turbo-Q5_K_S.gguf 2>/dev/null || echo "MISSING: GGUF model"
ls -lh ~/ComfyUI/models/text_encoders/gemma2_2b_lumina2.safetensors 2>/dev/null || echo "MISSING: Text encoder"
ls -lh ~/ComfyUI/models/vae/ae.safetensors 2>/dev/null || echo "MISSING: VAE"
echo ""
echo "=== ALL DOWNLOADS COMPLETE ==="
+22
View File
@@ -0,0 +1,22 @@
#!/bin/bash
source /home/fabian/ComfyUI/venv/bin/activate
export HSA_OVERRIDE_GFX_VERSION=10.1.0
export HSA_ENABLE_SDMA=0
export HIP_VISIBLE_DEVICES=0
# Find all torchvision directories
echo "=== torchvision locations ==="
find /home/fabian/ComfyUI/venv -name 'torchvision' -type d 2>/dev/null
echo "=== which init.py is loaded ==="
python3.11 -c "import torchvision; print(torchvision.__file__)" 2>&1 || true
echo "=== line 10 of loaded init ==="
python3.11 -c "
import importlib.util
spec = importlib.util.find_spec('torchvision')
print('Location:', spec.origin)
" 2>&1 || true
echo "=== check our patched file ==="
sed -n '10,14p' /home/fabian/ComfyUI/venv/lib/python3.11/site-packages/torchvision/__init__.py
+58
View File
@@ -0,0 +1,58 @@
#!/bin/bash
# =============================================================
# BC-250 GPU Activity Monitor
# Since rocm-smi GPU utilization is broken (always 0%),
# we use alternative metrics to verify GPU compute usage.
# =============================================================
echo "=== BC-250 GPU Activity Monitor ==="
echo "NOTE: GPU % utilization is broken on this hardware."
echo "Using alternative metrics instead."
echo ""
while true; do
TIMESTAMP=$(date '+%H:%M:%S')
# 1. GPU Clock — high clock = GPU active
SCLK=$(cat /sys/class/drm/card0/device/pp_dpm_sclk 2>/dev/null | grep '\*' | awk '{print $2}')
# 2. GPU power draw (if available)
POWER=$(cat /sys/class/drm/card0/device/hwmon/hwmon*/power1_average 2>/dev/null)
if [ -n "$POWER" ]; then
POWER_W=$(echo "scale=1; $POWER / 1000000" | bc 2>/dev/null || echo "N/A")
else
POWER_W="N/A"
fi
# 3. GPU VRAM usage (shared memory allocated by GPU)
VRAM_USED=$(cat /sys/class/drm/card0/device/mem_info_vram_used 2>/dev/null)
VRAM_TOTAL=$(cat /sys/class/drm/card0/device/mem_info_vram_total 2>/dev/null)
if [ -n "$VRAM_USED" ] && [ -n "$VRAM_TOTAL" ]; then
VRAM_MB=$(echo "scale=0; $VRAM_USED / 1048576" | bc 2>/dev/null || echo "N/A")
VRAM_TOTAL_MB=$(echo "scale=0; $VRAM_TOTAL / 1048576" | bc 2>/dev/null || echo "N/A")
else
VRAM_MB="N/A"
VRAM_TOTAL_MB="N/A"
fi
# 4. GPU temperature
TEMP=$(cat /sys/class/drm/card0/device/hwmon/hwmon*/temp1_input 2>/dev/null)
if [ -n "$TEMP" ]; then
TEMP_C=$(echo "scale=0; $TEMP / 1000" | bc 2>/dev/null || echo "N/A")
else
TEMP_C="N/A"
fi
# 5. HIP processes using GPU
HIP_PROCS=$(ls /proc/*/maps 2>/dev/null | xargs grep -l "libamdhip64\|libhsa-runtime" 2>/dev/null | wc -l)
# 6. Kernel GPU activity (interrupts)
GPU_IRQ=$(cat /proc/interrupts 2>/dev/null | grep amdgpu | awk '{sum=0; for(i=2;i<=NF-2;i++) sum+=$i; print sum}' | head -1)
# 7. System RAM (since BC-250 shares system RAM as VRAM)
RAM_INFO=$(free -m | grep Mem | awk '{printf "%dMB / %dMB (%.0f%%)", $3, $2, $3/$2*100}')
echo "[$TIMESTAMP] Clock: ${SCLK:-N/A} | Power: ${POWER_W}W | Temp: ${TEMP_C}°C | VRAM: ${VRAM_MB}/${VRAM_TOTAL_MB}MB | HIP Procs: $HIP_PROCS | RAM: $RAM_INFO"
sleep 2
done
+13
View File
@@ -0,0 +1,13 @@
import torch
print(f"PyTorch: {torch.__version__}")
print(f"CUDA available: {torch.cuda.is_available()}")
print(f"HIP version: {torch.version.hip}")
print(f"Device count: {torch.cuda.device_count()}")
if torch.cuda.is_available():
print(f"Device name: {torch.cuda.get_device_name(0)}")
t = torch.randn(100, 100, device="cuda")
r = torch.mm(t, t)
print(f"GPU matmul OK: result shape {r.shape}")
print("GPU COMPUTE WORKS!")
else:
print("NO GPU DETECTED")
+29
View File
@@ -0,0 +1,29 @@
import torch
import os
print(f"HSA_OVERRIDE_GFX_VERSION={os.environ.get('HSA_OVERRIDE_GFX_VERSION','NOT SET')}")
print(f"PyTorch arch list: {torch.cuda.get_arch_list()}")
print(f"Device: {torch.cuda.get_device_name(0)}")
print(f"GCN Arch: {torch.cuda.get_device_properties(0).gcnArchName}")
try:
t = torch.randn(256, 256, device="cuda")
r = torch.mm(t, t)
val = r[0,0].item()
print(f"GPU matmul OK! result[0,0]={val:.4f}")
# Bigger test
a = torch.randn(1024, 1024, device="cuda")
b = torch.randn(1024, 1024, device="cuda")
c = torch.mm(a, b)
print(f"Large matmul OK! shape={c.shape}")
# Test fp32 conv
x = torch.randn(1, 3, 64, 64, device="cuda")
conv = torch.nn.Conv2d(3, 16, 3, padding=1).cuda()
y = conv(x)
print(f"Conv2d OK! output shape={y.shape}")
print("ALL GPU TESTS PASSED!")
except Exception as e:
print(f"FAILED: {e}")
+26
View File
@@ -0,0 +1,26 @@
#!/bin/bash
cd /home/fabian/ComfyUI
source venv/bin/activate
export HSA_OVERRIDE_GFX_VERSION=10.1.0
export HSA_ENABLE_SDMA=0
export HIP_VISIBLE_DEVICES=0
export ROCM_PATH=/opt/rocm
export OMP_NUM_THREADS=12
export MKL_NUM_THREADS=12
export NUMEXPR_NUM_THREADS=12
export PYTORCH_HIP_ALLOC_CONF="expandable_segments:False"
# Unset harmful vars
unset GPU_MAX_HW_QUEUES 2>/dev/null || true
unset HIP_LAUNCH_BLOCKING 2>/dev/null || true
echo "Starting ComfyUI..."
echo "PyTorch: $(python3.11 -c 'import torch; print(torch.__version__)')"
echo "GPU: $(python3.11 -c 'import torch; print(torch.cuda.get_device_name(0) if torch.cuda.is_available() else \"NONE\")')"
python main.py \
--listen 0.0.0.0 \
--port 8188 \
--force-fp32 \
--lowvram
+28
View File
@@ -0,0 +1,28 @@
#!/bin/bash
# ComfyUI Launch for BC-250 APU — unified memory, no lowvram
cd /home/fabian/ComfyUI
source venv/bin/activate
export HSA_OVERRIDE_GFX_VERSION=10.1.0
export HSA_ENABLE_SDMA=0
export HIP_VISIBLE_DEVICES=0
export ROCM_PATH=/opt/rocm
export OMP_NUM_THREADS=12
export MKL_NUM_THREADS=12
export NUMEXPR_NUM_THREADS=12
export PYTORCH_HIP_ALLOC_CONF="expandable_segments:False"
# Unset harmful vars
unset GPU_MAX_HW_QUEUES 2>/dev/null || true
unset HIP_LAUNCH_BLOCKING 2>/dev/null || true
echo "Starting ComfyUI (APU mode - no lowvram)..."
# --force-fp32: required for gfx1010 (no native fp16 support in some ops)
# NO --lowvram: APU has unified memory, offloading is counterproductive
# --gpu-only: keep everything in VRAM (which IS the system RAM on APU)
python main.py \
--listen 0.0.0.0 \
--port 8188 \
--force-fp32 \
--gpu-only
+6
View File
@@ -0,0 +1,6 @@
#!/bin/bash
grep -oP '\[\d+/\d+\]' ~/pytorch-build-progress.log | tail -1
echo "---"
pgrep -c cc1plus 2>/dev/null || echo "0 compilers"
echo "compiler_procs"
free -m | grep Speicher
+55
View File
@@ -0,0 +1,55 @@
#!/bin/bash
# =============================================================
# ComfyUI Launch Script for AMD BC-250 (ROCm / gfx1013 → gfx1030 spoof)
# =============================================================
set -euo pipefail
echo "=========================================="
echo " ComfyUI — BC-250 ROCm Launcher"
echo "=========================================="
# --- GPU Health Check ---
if dmesg 2>/dev/null | tail -50 | grep -qi "KIQ fence timeout"; then
echo "[ABORT] KIQ fence timeout detected in dmesg — reboot required!"
exit 1
fi
echo "[OK] GPU health check passed"
# --- ROCm Environment for BC-250 ---
# CRITICAL: gfx1030 spoof (not gfx1010!) — PyTorch ROCm 6.2 has no gfx1010 kernels
export HSA_OVERRIDE_GFX_VERSION=10.3.0
export HSA_ENABLE_SDMA=0
export HIP_VISIBLE_DEVICES=0
export ROCM_PATH=/opt/rocm
export HSA_TOOLS_LIB=""
export HSA_TOOLS_REPORT_LOAD_FAILURE=0
export PATH="/opt/rocm/bin:$PATH"
export LD_LIBRARY_PATH="/opt/rocm/lib"
# --- Performance: DO NOT set these ---
unset GPU_MAX_HW_QUEUES 2>/dev/null || true
unset HIP_LAUNCH_BLOCKING 2>/dev/null || true
unset GGML_CUDA_ENABLE_UNIFIED_MEMORY 2>/dev/null || true
unset GGML_HIP_HOST_ALLOC 2>/dev/null || true
unset GGML_CUDA_NO_PINNED 2>/dev/null || true
unset GGML_HIP_NO_COARSE_GRAIN 2>/dev/null || true
unset HSA_DISABLE_FRAGMENT_ALLOCATOR 2>/dev/null || true
# --- PyTorch ROCm tuning ---
export PYTORCH_HIP_ALLOC_CONF="expandable_segments:False"
echo "[OK] ROCm environment configured (gfx1030 spoof)"
# --- Activate venv ---
cd ~/ComfyUI
source venv/bin/activate
# --- Launch ComfyUI ---
echo "[START] Launching ComfyUI on http://0.0.0.0:8188"
echo "=========================================="
python main.py \
--listen 0.0.0.0 \
--port 8188 \
--force-fp32 \
--lowvram \
"$@"
+66
View File
@@ -0,0 +1,66 @@
#!/bin/bash
# =============================================================
# ComfyUI Launch Script for AMD BC-250 (ROCm / gfx1013)
# Trusted source: BC250 ROCm Install README.md
# =============================================================
set -euo pipefail
echo "=========================================="
echo " ComfyUI — BC-250 ROCm Launcher"
echo "=========================================="
# --- GPU Health Check ---
if dmesg 2>/dev/null | tail -50 | grep -qi "KIQ fence timeout"; then
echo "[ABORT] KIQ fence timeout detected in dmesg — reboot required!"
exit 1
fi
echo "[OK] GPU health check passed"
# --- ROCm Environment for BC-250 (gfx1013 mapped to gfx1010) ---
# Per BC250 ROCm Install docs — ONLY these vars
export HSA_OVERRIDE_GFX_VERSION=10.1.0
export HSA_ENABLE_SDMA=0
export HIP_VISIBLE_DEVICES=0
export ROCM_PATH=/opt/rocm
export HSA_TOOLS_LIB=""
export HSA_TOOLS_REPORT_LOAD_FAILURE=0
export PATH="/opt/rocm/bin:$PATH"
export LD_LIBRARY_PATH="/opt/rocm/lib"
# --- Unset harmful old workarounds ---
unset GPU_MAX_HW_QUEUES 2>/dev/null || true
unset HIP_LAUNCH_BLOCKING 2>/dev/null || true
unset GGML_CUDA_ENABLE_UNIFIED_MEMORY 2>/dev/null || true
unset GGML_HIP_HOST_ALLOC 2>/dev/null || true
unset GGML_CUDA_NO_PINNED 2>/dev/null || true
unset GGML_HIP_NO_COARSE_GRAIN 2>/dev/null || true
unset HSA_DISABLE_FRAGMENT_ALLOCATOR 2>/dev/null || true
# --- PyTorch ROCm tuning ---
export PYTORCH_HIP_ALLOC_CONF="expandable_segments:False"
# --- CPU thread optimization for VAE and other CPU-bound ops ---
# BC-250 has 12 threads — use them all
export OMP_NUM_THREADS=12
export MKL_NUM_THREADS=12
export NUMEXPR_NUM_THREADS=12
export OPENBLAS_NUM_THREADS=12
echo "[OK] ROCm environment configured"
echo " GFX Override: $HSA_OVERRIDE_GFX_VERSION"
echo " OMP Threads: $OMP_NUM_THREADS"
# --- Activate venv ---
cd ~/ComfyUI
source venv/bin/activate
# --- Launch ComfyUI ---
echo "[START] Launching ComfyUI on http://0.0.0.0:8188"
echo "=========================================="
python main.py \
--listen 0.0.0.0 \
--port 8188 \
--force-fp32 \
--lowvram \
"$@"
+15
View File
@@ -0,0 +1,15 @@
#!/bin/bash
cat > /tmp/test_arch.hip << 'HIPEOF'
#include <hip/hip_runtime.h>
__global__ void test_kernel(float *a) { a[threadIdx.x] = 1.0f; }
HIPEOF
for arch in gfx1013 gfx1010 gfx10-1-generic; do
echo "=== Testing $arch ==="
/opt/rocm/bin/hipcc --offload-arch=$arch -c /tmp/test_arch.hip -o /tmp/test_${arch}.o 2>&1
echo "Exit: $?"
if [ -f /tmp/test_${arch}.o ]; then
ls -l /tmp/test_${arch}.o
fi
echo ""
done
+140
View File
@@ -0,0 +1,140 @@
#!/bin/bash
# Test image generation with correct GGUF workflow
API="http://127.0.0.1:8188"
echo "=== Queueing Z-Image Turbo generation ==="
WORKFLOW='{
"prompt": {
"1": {
"class_type": "UnetLoaderGGUF",
"inputs": {
"unet_name": "z_image_turbo-Q5_K_S.gguf"
}
},
"2": {
"class_type": "CLIPLoaderGGUF",
"inputs": {
"clip_name": "gemma2_2b_lumina2.safetensors",
"type": "lumina2"
}
},
"3": {
"class_type": "CLIPTextEncode",
"inputs": {
"text": "a beautiful mountain landscape at sunset, golden light, detailed, 4k",
"clip": ["2", 0]
}
},
"4": {
"class_type": "CLIPTextEncode",
"inputs": {
"text": "blurry, ugly, distorted",
"clip": ["2", 0]
}
},
"5": {
"class_type": "EmptyLatentImage",
"inputs": {
"width": 512,
"height": 512,
"batch_size": 1
}
},
"6": {
"class_type": "KSampler",
"inputs": {
"model": ["1", 0],
"positive": ["3", 0],
"negative": ["4", 0],
"latent_image": ["5", 0],
"seed": 42,
"steps": 8,
"cfg": 3.0,
"sampler_name": "euler",
"scheduler": "normal",
"denoise": 1.0
}
},
"7": {
"class_type": "VAELoader",
"inputs": {
"vae_name": "ae.safetensors"
}
},
"8": {
"class_type": "VAEDecode",
"inputs": {
"samples": ["6", 0],
"vae": ["7", 0]
}
},
"9": {
"class_type": "SaveImage",
"inputs": {
"images": ["8", 0],
"filename_prefix": "bc250_test"
}
}
}
}'
RESPONSE=$(curl -s -X POST "$API/prompt" -H "Content-Type: application/json" -d "$WORKFLOW")
echo "Response: $RESPONSE" | head -c 500
echo ""
PROMPT_ID=$(echo "$RESPONSE" | python3.11 -c "import sys,json; print(json.load(sys.stdin).get('prompt_id','NONE'))" 2>/dev/null)
echo "Prompt ID: $PROMPT_ID"
if [ "$PROMPT_ID" = "NONE" ] || [ -z "$PROMPT_ID" ]; then
echo "ERROR: Failed to queue!"
exit 1
fi
echo ""
echo "=== Waiting for generation (up to 10 min) ==="
for i in $(seq 1 120); do
sleep 5
STATUS=$(curl -s "$API/history/$PROMPT_ID" 2>/dev/null)
HAS_OUTPUT=$(echo "$STATUS" | python3.11 -c "
import sys, json
data = json.load(sys.stdin)
pid = '$PROMPT_ID'
if pid in data:
outputs = data[pid].get('outputs', {})
status = data[pid].get('status', {})
if status.get('status_str') == 'error':
msgs = status.get('messages', [])
print('ERROR:' + str(msgs[-1] if msgs else 'unknown'))
elif '9' in outputs:
images = outputs['9'].get('images', [])
if images:
print('DONE:' + images[0].get('filename', 'unknown'))
else:
print('PROCESSING')
else:
print('PROCESSING')
else:
print('WAITING')
" 2>/dev/null)
echo "[$((i*5))s] $HAS_OUTPUT"
if [[ "$HAS_OUTPUT" == DONE:* ]]; then
FILENAME=${HAS_OUTPUT#DONE:}
echo ""
echo "=========================================="
echo " SUCCESS - Image generated!"
echo " File: /home/fabian/ComfyUI/output/$FILENAME"
ls -lh "/home/fabian/ComfyUI/output/$FILENAME" 2>/dev/null
echo "=========================================="
exit 0
fi
if [[ "$HAS_OUTPUT" == ERROR:* ]]; then
echo ""
echo "GENERATION FAILED: $HAS_OUTPUT"
echo "=== ComfyUI log tail ==="
tail -30 /home/fabian/comfyui2.log
exit 1
fi
done
echo "TIMEOUT after 10 minutes"
tail -20 /home/fabian/comfyui2.log
+145
View File
@@ -0,0 +1,145 @@
#!/bin/bash
# Test image generation - v3 with CLIPLoader (not GGUF) for safetensors clip
API="http://127.0.0.1:8188"
echo "=== Queueing Z-Image Turbo generation v3 ==="
WORKFLOW='{
"prompt": {
"1": {
"class_type": "UnetLoaderGGUF",
"inputs": {
"unet_name": "z_image_turbo-Q5_K_S.gguf"
}
},
"2": {
"class_type": "CLIPLoader",
"inputs": {
"clip_name": "gemma2_2b_lumina2.safetensors",
"type": "lumina2"
}
},
"3": {
"class_type": "CLIPTextEncode",
"inputs": {
"text": "a beautiful mountain landscape at sunset, golden light, detailed, 4k",
"clip": ["2", 0]
}
},
"4": {
"class_type": "CLIPTextEncode",
"inputs": {
"text": "blurry, ugly, distorted",
"clip": ["2", 0]
}
},
"5": {
"class_type": "EmptyLatentImage",
"inputs": {
"width": 512,
"height": 512,
"batch_size": 1
}
},
"6": {
"class_type": "KSampler",
"inputs": {
"model": ["1", 0],
"positive": ["3", 0],
"negative": ["4", 0],
"latent_image": ["5", 0],
"seed": 42,
"steps": 8,
"cfg": 3.0,
"sampler_name": "euler",
"scheduler": "normal",
"denoise": 1.0
}
},
"7": {
"class_type": "VAELoader",
"inputs": {
"vae_name": "ae.safetensors"
}
},
"8": {
"class_type": "VAEDecode",
"inputs": {
"samples": ["6", 0],
"vae": ["7", 0]
}
},
"9": {
"class_type": "SaveImage",
"inputs": {
"images": ["8", 0],
"filename_prefix": "bc250_test"
}
}
}
}'
RESPONSE=$(curl -s -X POST "$API/prompt" -H "Content-Type: application/json" -d "$WORKFLOW")
echo "Response: $(echo $RESPONSE | head -c 200)"
echo ""
PROMPT_ID=$(echo "$RESPONSE" | python3.11 -c "import sys,json; print(json.load(sys.stdin).get('prompt_id','NONE'))" 2>/dev/null)
echo "Prompt ID: $PROMPT_ID"
if [ "$PROMPT_ID" = "NONE" ] || [ -z "$PROMPT_ID" ]; then
echo "ERROR: Failed to queue!"
echo "Full response: $RESPONSE"
exit 1
fi
echo ""
echo "=== Waiting for generation (up to 10 min) ==="
for i in $(seq 1 120); do
sleep 5
STATUS=$(curl -s "$API/history/$PROMPT_ID" 2>/dev/null)
HAS_OUTPUT=$(echo "$STATUS" | python3.11 -c "
import sys, json
data = json.load(sys.stdin)
pid = '$PROMPT_ID'
if pid in data:
outputs = data[pid].get('outputs', {})
status = data[pid].get('status', {})
if status.get('status_str') == 'error':
msgs = status.get('messages', [])
for m in msgs:
if isinstance(m, list) and len(m)>1 and isinstance(m[1],dict):
em = m[1].get('exception_message','')
if em:
print('ERROR:' + em[:200])
break
else:
print('ERROR:unknown')
elif '9' in outputs:
images = outputs['9'].get('images', [])
if images:
print('DONE:' + images[0].get('filename', 'unknown'))
else:
print('PROCESSING')
else:
print('PROCESSING')
else:
print('WAITING')
" 2>/dev/null)
echo "[$((i*5))s] $HAS_OUTPUT"
if [[ "$HAS_OUTPUT" == DONE:* ]]; then
FILENAME=${HAS_OUTPUT#DONE:}
echo ""
echo "=========================================="
echo " SUCCESS - Image generated!"
echo " File: /home/fabian/ComfyUI/output/$FILENAME"
ls -lh "/home/fabian/ComfyUI/output/$FILENAME" 2>/dev/null
echo "=========================================="
exit 0
fi
if [[ "$HAS_OUTPUT" == ERROR:* ]]; then
echo ""
echo "GENERATION FAILED: $HAS_OUTPUT"
tail -10 /home/fabian/comfyui2.log
exit 1
fi
done
echo "TIMEOUT"
+142
View File
@@ -0,0 +1,142 @@
#!/bin/bash
# Test image generation via ComfyUI API
# Workflow: Z-Image Turbo GGUF + Gemma2 CLIP + AE VAE
API="http://127.0.0.1:8188"
echo "=== Checking ComfyUI API ==="
curl -s "$API/system_stats" | python3.11 -m json.tool 2>/dev/null | head -20
echo ""
echo "=== Listing available models ==="
curl -s "$API/models/unet" 2>/dev/null
echo ""
curl -s "$API/models/clip" 2>/dev/null
echo ""
curl -s "$API/models/vae" 2>/dev/null
echo ""
echo "=== Queueing image generation ==="
WORKFLOW='{
"prompt": {
"1": {
"class_type": "UNETLoader",
"inputs": {
"unet_name": "z_image_turbo-Q5_K_S.gguf",
"weight_dtype": "default"
}
},
"2": {
"class_type": "DualCLIPLoader",
"inputs": {
"clip_name1": "gemma2_2b_lumina2.safetensors",
"clip_name2": "gemma2_2b_lumina2.safetensors",
"type": "lumina2"
}
},
"3": {
"class_type": "CLIPTextEncode",
"inputs": {
"text": "a beautiful mountain landscape at sunset, golden light, detailed, 4k",
"clip": ["2", 0]
}
},
"4": {
"class_type": "CLIPTextEncode",
"inputs": {
"text": "blurry, ugly, distorted",
"clip": ["2", 0]
}
},
"5": {
"class_type": "EmptyLatentImage",
"inputs": {
"width": 512,
"height": 512,
"batch_size": 1
}
},
"6": {
"class_type": "KSampler",
"inputs": {
"model": ["1", 0],
"positive": ["3", 0],
"negative": ["4", 0],
"latent_image": ["5", 0],
"seed": 42,
"steps": 8,
"cfg": 3.0,
"sampler_name": "euler",
"scheduler": "normal",
"denoise": 1.0
}
},
"7": {
"class_type": "VAELoader",
"inputs": {
"vae_name": "ae.safetensors"
}
},
"8": {
"class_type": "VAEDecode",
"inputs": {
"samples": ["6", 0],
"vae": ["7", 0]
}
},
"9": {
"class_type": "SaveImage",
"inputs": {
"images": ["8", 0],
"filename_prefix": "bc250_test"
}
}
}
}'
RESPONSE=$(curl -s -X POST "$API/prompt" -H "Content-Type: application/json" -d "$WORKFLOW")
echo "Queue response: $RESPONSE"
PROMPT_ID=$(echo "$RESPONSE" | python3.11 -c "import sys,json; print(json.load(sys.stdin).get('prompt_id','NONE'))" 2>/dev/null)
echo "Prompt ID: $PROMPT_ID"
if [ "$PROMPT_ID" = "NONE" ] || [ -z "$PROMPT_ID" ]; then
echo "ERROR: Failed to queue prompt!"
exit 1
fi
echo ""
echo "=== Waiting for generation ==="
for i in $(seq 1 60); do
sleep 5
STATUS=$(curl -s "$API/history/$PROMPT_ID" 2>/dev/null)
HAS_OUTPUT=$(echo "$STATUS" | python3.11 -c "
import sys, json
data = json.load(sys.stdin)
if '$PROMPT_ID' in data:
outputs = data['$PROMPT_ID'].get('outputs', {})
if '9' in outputs:
images = outputs['9'].get('images', [])
if images:
print('DONE:' + images[0].get('filename', 'unknown'))
else:
print('PROCESSING')
else:
print('PROCESSING')
else:
print('WAITING')
" 2>/dev/null)
echo "[$((i*5))s] $HAS_OUTPUT"
if [[ "$HAS_OUTPUT" == DONE:* ]]; then
FILENAME=${HAS_OUTPUT#DONE:}
echo ""
echo "=== SUCCESS ==="
echo "Image generated: $FILENAME"
echo "File location: /home/fabian/ComfyUI/output/$FILENAME"
ls -lh "/home/fabian/ComfyUI/output/$FILENAME" 2>/dev/null
exit 0
fi
done
echo "TIMEOUT: Generation did not complete in 5 minutes"
echo "=== Checking queue ==="
curl -s "$API/queue" | python3.11 -m json.tool 2>/dev/null | head -20
+23
View File
@@ -0,0 +1,23 @@
#!/bin/bash
source /home/fabian/ComfyUI/venv/bin/activate
export HSA_OVERRIDE_GFX_VERSION=10.1.0
export HSA_ENABLE_SDMA=0
export HIP_VISIBLE_DEVICES=0
python3.11 -c "
import torch
print('PyTorch version:', torch.__version__)
print('HIP version:', torch.version.hip)
print('CUDA available:', torch.cuda.is_available())
if torch.cuda.is_available():
print('Device name:', torch.cuda.get_device_name(0))
print('Device count:', torch.cuda.device_count())
# Quick tensor test
x = torch.randn(100, 100, device='cuda')
y = torch.randn(100, 100, device='cuda')
z = x @ y
print('GPU matmul test: OK, shape', z.shape)
print('Memory allocated:', torch.cuda.memory_allocated(0) / 1024 / 1024, 'MB')
else:
print('NO GPU DETECTED')
"
+64
View File
@@ -0,0 +1,64 @@
#!/bin/bash
# Runtime test: which arch actually RUNS on the BC-250?
export HSA_ENABLE_SDMA=0
cat > /tmp/run_test.hip << 'HIPEOF'
#include <hip/hip_runtime.h>
#include <cstdio>
__global__ void add_kernel(float *a, float *b, float *c, int n) {
int i = blockIdx.x * blockDim.x + threadIdx.x;
if (i < n) c[i] = a[i] + b[i];
}
int main() {
hipDeviceProp_t prop;
hipGetDeviceProperties(&prop, 0);
printf("Device: %s\n", prop.name);
printf("GCN Arch: %s\n", prop.gcnArchName);
const int N = 256;
float h_a[N], h_b[N], h_c[N];
for (int i = 0; i < N; i++) { h_a[i] = i; h_b[i] = i * 2; }
float *d_a, *d_b, *d_c;
hipMallocManaged(&d_a, N * sizeof(float));
hipMallocManaged(&d_b, N * sizeof(float));
hipMallocManaged(&d_c, N * sizeof(float));
memcpy(d_a, h_a, N * sizeof(float));
memcpy(d_b, h_b, N * sizeof(float));
add_kernel<<<1, N>>>(d_a, d_b, d_c, N);
hipDeviceSynchronize();
hipError_t err = hipGetLastError();
if (err != hipSuccess) {
printf("FAIL: %s\n", hipGetErrorString(err));
hipFree(d_a); hipFree(d_b); hipFree(d_c);
return 1;
}
// Verify
int ok = 1;
for (int i = 0; i < N; i++) {
if (d_c[i] != h_a[i] + h_b[i]) { ok = 0; break; }
}
printf("Compute: %s\n", ok ? "PASS" : "FAIL");
hipFree(d_a); hipFree(d_b); hipFree(d_c);
return ok ? 0 : 1;
}
HIPEOF
for arch in gfx1013 gfx1010 gfx10-1-generic; do
echo "=== Runtime test: $arch ==="
/opt/rocm/bin/hipcc --offload-arch=$arch /tmp/run_test.hip -o /tmp/run_test_${arch} 2>&1
if [ $? -eq 0 ]; then
echo "Compiled OK, running..."
timeout 10 /tmp/run_test_${arch} 2>&1
echo "Runtime exit: $?"
else
echo "Compile FAILED"
fi
echo ""
done
+64
View File
@@ -0,0 +1,64 @@
#!/bin/bash
export HSA_ENABLE_SDMA=0
cat > /tmp/run_test2.hip << 'HIPEOF'
#include <hip/hip_runtime.h>
#include <cstdio>
__global__ void add_kernel(float *a, float *b, float *c, int n) {
int i = blockIdx.x * blockDim.x + threadIdx.x;
if (i < n) c[i] = a[i] + b[i];
}
int main() {
hipDeviceProp_t prop;
hipGetDeviceProperties(&prop, 0);
printf("Device: %s\n", prop.name);
printf("GCN Arch: %s\n", prop.gcnArchName);
const int N = 256;
float h_a[N], h_b[N], h_c[N];
for (int i = 0; i < N; i++) { h_a[i] = (float)i; h_b[i] = (float)(i * 2); }
float *d_a, *d_b, *d_c;
hipMallocManaged(&d_a, N * sizeof(float));
hipMallocManaged(&d_b, N * sizeof(float));
hipMallocManaged(&d_c, N * sizeof(float));
hipMemcpy(d_a, h_a, N * sizeof(float), hipMemcpyHostToDevice);
hipMemcpy(d_b, h_b, N * sizeof(float), hipMemcpyHostToDevice);
add_kernel<<<1, N>>>(d_a, d_b, d_c, N);
hipDeviceSynchronize();
hipError_t err = hipGetLastError();
if (err != hipSuccess) {
printf("KERNEL FAIL: %s\n", hipGetErrorString(err));
hipFree(d_a); hipFree(d_b); hipFree(d_c);
return 1;
}
hipMemcpy(h_c, d_c, N * sizeof(float), hipMemcpyDeviceToHost);
int ok = 1;
for (int i = 0; i < N; i++) {
if (h_c[i] != h_a[i] + h_b[i]) { ok = 0; printf("Mismatch at %d: %f vs %f\n", i, h_c[i], h_a[i]+h_b[i]); break; }
}
printf("Compute: %s\n", ok ? "PASS" : "FAIL");
hipFree(d_a); hipFree(d_b); hipFree(d_c);
return ok ? 0 : 1;
}
HIPEOF
for arch in gfx1013 gfx1010 gfx10-1-generic; do
echo "=== Runtime test: $arch ==="
/opt/rocm/bin/hipcc --offload-arch=$arch /tmp/run_test2.hip -o /tmp/run_test2_${arch} 2>&1
if [ $? -eq 0 ]; then
echo "Compiled OK. Running..."
timeout 15 /tmp/run_test2_${arch} 2>&1
echo "Exit: $?"
else
echo "Compile FAILED"
fi
echo ""
done
+13
View File
@@ -0,0 +1,13 @@
#!/bin/bash
source /home/fabian/ComfyUI/venv/bin/activate
export HSA_OVERRIDE_GFX_VERSION=10.1.0
export HSA_ENABLE_SDMA=0
export HIP_VISIBLE_DEVICES=0
python3.11 -c "
import torchvision
print('torchvision version:', torchvision.__version__)
from torchvision import transforms
print('transforms OK')
print('ALL GOOD')
"