Uploaded sanitized BC250/ROCm Repository.
This commit is contained in:
@@ -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')
|
||||
@@ -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!"
|
||||
@@ -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!"
|
||||
@@ -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"
|
||||
@@ -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__)"
|
||||
@@ -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!"
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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"
|
||||
@@ -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 ==="
|
||||
@@ -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/
|
||||
@@ -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"
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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 ==="
|
||||
@@ -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 ==="
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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")
|
||||
@@ -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}")
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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 \
|
||||
"$@"
|
||||
@@ -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 \
|
||||
"$@"
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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"
|
||||
@@ -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
|
||||
@@ -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')
|
||||
"
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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')
|
||||
"
|
||||
Reference in New Issue
Block a user