Onnx web runtime 구축하기 with Vite
소개
Vission AI를 사용자 로컬 환경에서 실행하기 위해 WebGPU, WebGL, WASM을 통해 Web환경에서 AI Model을 실행한 방법들과 Model을 캐싱하며 버전관리를 하는 방법에 대해 작성하였다.
목차
배경
의료용 AI 모바일 애플리케이션으로 X-ray, C-arm 등의 이미지를 스마트폰으로 촬영해서 이미지를 원상태로 펼쳐주고 각각의 뼈 각도를 측정할 수 있는 OnDevice AI 서비스를 개발하여 테스트 중이다. 하지만 현업 의사분들이 사용 시 노트북에 있는 이미지 파일을 바로 확인하여 다음날 봐야할 환자들의 정보를 미리 확인할 수 있도록 하는 기능이 필요하였고, 이를 위해 Web runtime onnx를 사용하여 Web browser에 AI Model을 캐싱하고 사용자의 로컬환경에서 실행할 수 있도록 적용하여야했다.
아래 내용은 Web runtime onnx를 실행하기 위해 찾아본 정보들을 정리한 내용이다.
Get Started
ONNX Runtime Web을 적용하는 방법으로 공식사이트에서는 아래의 방법들을 소개한다.
JavaScript import statement
Install
- npm
- yarn
# install latest release version
npm install onnxruntime-web
# install nightly build dev version
npm install onnxruntime-web@dev
# install latest release version
yarn add onnxruntime-web
# install nightly build dev version
yarn add onnxruntime-web@dev
Import
import * as ort from "onnxruntime-web";
하지만 위 방법대로만 적용한다면
no available backend found. ERR: [webgpu] RuntimeError: Aborted(both async and sync fetching of the wasm failed). Build with -sASSERTIONS for more info., [webgl] backend not found., [wasm] Error: previous call to 'initWasm()' failed.
와 같이 no available backend found
에러가 발생한다. 현재 프로젝트 환경은 React Router V7 + Vite
이므로 이에 추가적인 설정이 필요하다
...
export default defineConfig({
...
...
assetsInclude: ["**/*.onnx"],
optimizeDeps: {
exclude: ["onnxruntime-web"],
},
});
-
assetsInclude: ["**/*.onnx"]
.onnx
파일을 정적 자산(asset)으로 처리- 해당 파일들은 빌드 시
dist/
폴더로 복사되고 URL을 통해 접근 가능 - 모델 파일을
import
하거나public
폴더에서fetch
할 수 있도록 해줌
-
optimizeDeps: exclude: ["onnxruntime-web"]
onnxruntime-web
패키지를 Vite 사전 번들링(pre-bundling)에서 제외- 이 패키지는 WASM 파일과 복잡한 로딩 로직을 포함하므로 런타임에 동적으로 로드되어야 함
- Vite가 이 패키지를 ESM으로 변환하려다 실패하는 것을 방지
간단한 프로젝트라면 CDN 에서 script 를 받아와 js
로 실행해주는 것도 가능하다.