컴파일러 오류 관련하여 문의드립니다

안녕하세요.

현재 Furiosa 컴파일러로 ONNX 모델을 ENF로 변환하는 과정에서 문제가 발생하고 있습니다.

MatMul 또는 Gemm 연산(또는 이에 대응하는 1×1 Conv 표현)을 포함한 모델을 furiosa-compiler로 컴파일할 때, 행렬의 모든 차원이 64 이하인 경우에는 정상적으로 ENF가 생성되지만, 한 차원이라도 65 이상이면 컴파일 중 내부 오류(panic)가 발생하여 ENF 생성이 실패합니다. 예를 들어 27×32, 64×64 크기는 정상 처리되나, 65×32, 32×65, 65×100, 100×65 등 행 또는 열 중 하나만 65 이상이어도 컴파일러가 종료됩니다.

이 현상은 MatMul, Gemm, 그리고 MatMul을 1×1 Conv로 변환한 모델 모두에서 동일하게 재현됩니다.오류 발생 시 출력되는 로그는 다음과 같습니다.

[1/6] 🔍   Compiling from onnx to dfg
Done in 0.014610008s
[2/6] 🔍   Compiling from dfg to ldfg
thread 'main' panicked at 'attempt to shift left with overflow',
crates/npu-compiler/src/compile/dfg_to_ldfg/lower/tactic/tensor/hcp.rs:52:72
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
error: failed to fill whole buffer
Error: Failed to generate ENF

MatMul과 Gemm 모두에서 동일하게 발생하며, 연산 종류와 무관하게 행렬 크기가 65 이상이면 컴파일러가 종료됩니다.

이 오류가 발생하는 정확한 이유가 무엇인지, 그리고 행렬 차원이 65 이상인 연산을 현재 컴파일러에서 어떻게 처리해야 하는지 궁금하여 문의드립니다.

추가로 sparse matrix 연산은 구현이 불가능한지 궁금하여 문의드립니다.

감사합니다.

안녕하세요, 퓨리오사에이아이 정주희입니다.

로그의 ‘attempt to shift left with overflow’ panic은 로워링 단계에서 특정 텐서 축을 타일/비트마스크 기반으로 처리하는 과정에서 범위를 벗어나 발생하는 오류로 보입니다.
현재 Warboy 컴파일러는 연산에 참여하는 축이 명확히 라벨링(labeled) 되어 있어야 로워링이 가능한데, 제보해주신 케이스에서는 첫 번째 축이 batch 축으로 해석됩니다. 이때 해당 값이 65 이상이면, 내부 타일링/마스킹 계산에서 지원 범위를 넘어 panic이 발생하며 ENF 생성이 실패합니다.

당장 우회가 필요하신 경우, 65 이상이 되는 축(문제 축) 을 64 이하 블록으로 분할한 뒤 각 블록에 대해 연산을 수행하고, 결과를 다시 합치는 방식(예: split 후 concat)으로 그래프를 재구성하시면 컴파일이 가능할 수 있습니다.

추가로 문의주신 sparse matrix 연산의 경우, 현재 컴파일러/런타임에서는 별도의 sparse 연산 형태로는 지원하지 않는 상태입니다.

감사합니다.