This repository has been archived on 2026-08-19. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
ROCm-Research-Archive/Scripts and Tests/clip_cpu_test.py
T
2026-08-20 00:45:43 +02:00

96 lines
3.2 KiB
Python

#!/usr/bin/env python3
"""
BC-250: Test CLIP on CPU only (bypass GPU kernel compilation).
"""
import os, sys, time
os.environ["HSA_OVERRIDE_GFX_VERSION"] = "10.1.0"
os.environ["HSA_ENABLE_SDMA"] = "0"
os.environ["HIP_VISIBLE_DEVICES"] = "0"
os.environ["BC250_SOFTMAX_THRESHOLD"] = "512"
sys.path.insert(0, "/home/fabian/ComfyUI")
print("[T] Importing...", flush=True)
import bc250_softmax_patch
import torch
import safetensors.torch
# Check file size
clip_path = "/home/fabian/ComfyUI/models/text_encoders/gemma2_2b_lumina2.safetensors"
fsize = os.path.getsize(clip_path) / (1024*1024*1024)
print(f"[T] CLIP file: {fsize:.2f} GB", flush=True)
# Load directly to see what's in it
print(f"[T] Loading safetensors headers...", flush=True)
t0 = time.time()
with safetensors.torch.safe_open(clip_path, framework="pt", device="cpu") as f:
keys = list(f.keys())
print(f"[T] Keys: {len(keys)}", flush=True)
print(f"[T] First 5 keys: {keys[:5]}", flush=True)
# Check dtype and shapes of first key
first_tensor = f.get_tensor(keys[0])
print(f"[T] First tensor: {keys[0]} shape={first_tensor.shape} dtype={first_tensor.dtype}", flush=True)
# Check total parameter count
total_params = 0
for k in keys:
t = f.get_tensor(k)
total_params += t.numel()
print(f"[T] Total params: {total_params/1e9:.2f}B", flush=True)
dt = time.time() - t0
print(f"[T] Loaded headers in {dt:.1f}s", flush=True)
# Now try loading CLIP with ComfyUI but force CPU
print(f"\n[T] Loading CLIP through ComfyUI (on CPU)...", flush=True)
import comfy.sd
import comfy.model_management
import folder_paths
# Monkey-patch to force CPU loading for CLIP
_orig_get_torch_device = comfy.model_management.get_torch_device
_orig_text_encoder_device = comfy.model_management.text_encoder_device
_orig_text_encoder_offload = comfy.model_management.text_encoder_offload_device
# Force text encoder to CPU
comfy.model_management.text_encoder_device = lambda: torch.device("cpu")
comfy.model_management.text_encoder_offload_device = lambda: torch.device("cpu")
t1 = time.time()
try:
clip = comfy.sd.load_clip(
ckpt_paths=[clip_path],
embedding_directory=None,
clip_type=comfy.sd.CLIPType.LUMINA2,
)
dt = time.time() - t1
print(f"[T] CLIP loaded in {dt:.1f}s", flush=True)
# Test encoding
print(f"[T] Testing text encoding on CPU...", flush=True)
t2 = time.time()
tokens = clip.tokenize({"g": "a photo of a cat sitting on a windowsill"})
print(f"[T] Tokenized in {time.time()-t2:.3f}s", flush=True)
t3 = time.time()
output = clip.encode_from_tokens_scheduled(tokens)
cond = output[0]
dt = time.time() - t3
print(f"[T] CLIP encoded in {dt:.1f}s", flush=True)
print(f"[T] Output shape: {cond.shape}, dtype: {cond.dtype}", flush=True)
print(f"\n[T] === CLIP ON CPU WORKS! ===", flush=True)
except Exception as e:
print(f"[T] ERROR: {e}", flush=True)
import traceback
traceback.print_exc()
# Restore
comfy.model_management.text_encoder_device = _orig_text_encoder_device
comfy.model_management.text_encoder_offload_device = _orig_text_encoder_offload
print(f"[T] Total: {time.time()-t0:.1f}s", flush=True)
os._exit(0)