MI50의 가격이 급등한 이후 몇 달 동안 저는 사용되지 않거나 저평가된 컴퓨팅 벡터(compute vectors)를 찾아 헤매고 있었습니다. 그러다 단독 보드 형태로 나온 회수된 PS5 APU가 등장했습니다. Zen 2, 16 GB 통합 GDDR6, RDNA 2 (gfx1013) 사양입니다. eBay에서 50~150달러 사이에 판매되고 있으며, 40개의 CU 중 24개만 활성화된 상태로 배송됩니다.
궁금증이 생겨 amdgpu 소스 코드를 읽기 시작했습니다. 확인 결과, 두 개의 레지스터가 CU 가용성을 제어하고 있었습니다:
CC_GC_SHADER_ARRAY_CONFIG: 드라이버에 CU가 몇 개 존재하는지 알려줍니다.
SPI_PG_ENABLE_STATIC_WGP_MASK: 셰이더 프로세서(shader processor)에 작업을 어디로 보낼지 알려줍니다.
알고 보니 두 레지스터 모두 드라이버 초기화 경로 내부에서 하드웨어 레지스터를 지움으로써 쓰기가 가능했습니다. 둘 다 설정해야 하며, 하나만 설정해서는 아무런 효과가 없습니다.
pp512 수치 (Vulkan, llama.cpp):
| 설정 | tok/s | 전력 | 온도 |
|---|
| 24 CU @ 1500 MHz | 230 | 55W | 71C |
| ... | | | |
또한 gfx1013를 위한 커스텀 HIP 커널(kernel) 작업도 진행 중입니다. 현재 전용 커널이 없으며, tensile에서도 사용할 수 있는 최적화가 없기 때문입니다. HIP은 이미 토큰 생성 속도에서 Vulkan을 앞서고 있습니다 (9B 모델 기준 48 vs 30 tok/s). 프리필(prefill)은 아직 뒤처져 있지만 격차를 줄여가고 있습니다. Vulkan 백엔드는 fp16 FMA 역양자화(dequant)를 사용하는데, 이는 HIP의 int8 dp4a 경로와 맞추기 어렵습니다. 하지만 저희는 RADV 컴파일러가 수행하는 방식에 맞춰 데이터 흐름을 재구성하는 커스텀 MMQ 커널을 구축하고 있습니다. 초기 결과는 유망하며, 이미 기준이 되는 HIP 대비 Q6_K에서 +63%의 pp(prefill) 성능을 확보했습니다.
리포지토리(repo): https://github.com/duggasco/bc250-40cu-unlock
이 보드를 보유하고 계시다면 디스코드(discord)로 오세요: discord.gg/8eZfFWhczz