본문으로 건너뛰기

[onnxruntime] ONNX Runtime WebGPU EP: 디바이스 없는 오프라인 컴파일 지원

PR 링크: microsoft/onnxruntime#29681 상태: Merged | 변경: +1244 / -185

들어가며

최신 웹 브라우저 환경에서 머신러닝 모델을 실행할 때, 보안은 매우 중요한 요소입니다. 특히 Chromium의 WebNN 컴파일러 프로세스와 같이 샌드박스 환경에서는 하드웨어 접근이 제한되거나 차단됩니다. 기존의 ONNX Runtime(ORT)은 세션 초기화 시점에 하드웨어 디바이스를 초기화하고 커널을 생성하는 과정을 거치는데, 이는 디바이스가 없는 환경에서 실패할 수밖에 없습니다. 본 PR은 하드웨어 디바이스 없이도 모델의 그래프 최적화 및 파티셔닝을 수행하고, 최적화된 모델을 직렬화할 수 있는 'Compile-only' 세션 모드를 도입하여 이러한 문제를 해결합니다.

코드 분석

1. InferenceSession의 초기화 흐름 제어

InferenceSession::Initialize 과정에서 디바이스 의존적인 FinalizeSessionState 호출을 건너뛰도록 수정했습니다. 이를 통해 디바이스가 없는 환경에서도 그래프 최적화 단계까지만 수행하고 조기 종료할 수 있습니다.

// Before: 항상 FinalizeSessionState를 호출하여 디바이스 초기화 시도
ORT_RETURN_IF_ERROR(FinalizeSessionState());

// After: Compile-only 모드일 경우 조기 종료
if (session_options_.config_options.GetConfigOrDefault(kOrtSessionOptionCompileOnly, "0") == "1") {
  return Status::OK();
}

2. WebGPU EP의 디바이스 없는 컨텍스트 지원

WebGpuContext는 이제 HasDevice()를 통해 실제 디바이스 존재 여부를 확인합니다. 디바이스가 없는 경우, 실제 할당자 대신 WebGpuNoOpAllocator를 사용하여 메모리 할당 시도를 방지합니다.

// WebGpuNoOpAllocator는 할당 요청 시 예외를 발생시키거나 무시하여 안전한 컴파일 환경 제공
class WebGpuNoOpAllocator : public IAllocator {
  void* Alloc(size_t size) override { ORT_THROW("No-op allocator should not be called"); }
  void Free(void* p) override { /* ... */ }
};

3. 빌드 시스템 최적화 (Delay-load)

샌드박스 환경에서 user32.dll과 같은 시스템 라이브러리 로드 실패를 방지하기 위해 cmake 설정을 조정했습니다.

# Windows 환경에서 user32.dll을 지연 로드하여 Win32k lockdown 환경 대응
if (WIN32 AND onnxruntime_ENABLE_DELAY_LOADING_WIN_DLLS)
  list(APPEND onnxruntime_DELAYLOAD_FLAGS "/DELAYLOAD:user32.dll")
endif()

왜 이게 좋은가

  1. 보안 강화: 신뢰할 수 없는 모델을 처리하는 그래프 최적화 과정을 고권한 GPU 프로세스가 아닌, 저권한의 샌드박스 프로세스에서 수행할 수 있습니다.
  2. 유연성: kOrtSessionOptionCompileOnly 플래그를 통해 기존 API를 변경하지 않고도 오프라인 컴파일 모드를 활성화할 수 있습니다.
  3. 성능: 불필요한 커널 생성, 메모리 계획 수립, 디바이스 데이터 전송을 생략함으로써 컴파일 전용 세션의 초기화 속도를 크게 향상시켰습니다.

이번 변경은 특정 EP에 국한되지 않고 ORT의 전반적인 Compile API 활용도를 높이는 방향으로 설계되었습니다. 특히 FinalizeSessionState를 건너뛰는 로직은 다른 EP에서도 유사한 오프라인 컴파일 시나리오를 구현할 때 참고할 수 있는 좋은 패턴입니다.

참고 자료

⚠️ 알림: 이 분석은 AI가 실제 코드 diff를 기반으로 작성했습니다.

댓글

관련 포스트

PR Analysis 의 다른글