ONNX Runtime으로 브라우저에서 AI 모델 실행하기
ONNX Runtime으로 브라우저에서 AI 모델 실행하기
수년 동안 "브라우저의 AI"는 장난감 데모처럼 들렸습니다: MNIST에 대한 작은 분류기, 노트북을 녹이는 스타일 트랜스퍼 정도. 그것은 ONNX Runtime Web이 성숙하고 WebGPU/WebGL 경로가 실제 이미지 워크로드에 충분히 안정적이 되었을 때 바뀌었습니다. Ai2Done에서는 ONNX 기반 모델을 사용하여 향상 및 세그멘테이션과 같은 기능을 기기에서 구동합니다. 사용자의 사진을 원격 GPU로 보내는 것은 우리가 지지하는 모든 것에 모순되기 때문입니다.
왜 특별히 ONNX인가?
ONNX 형식은 모델 작성과 배포를 분리합니다. 연구자는 PyTorch 또는 다른 곳에서 학습하고 ONNX로 내보내며, 우리는 ONNX Runtime이 다양한 실행 공급자에 맞게 최적화할 수 있는 단일 아티팩트를 사용합니다. 브라우저에서는 가용한 경우 WebGPU를 타겟팅하고 그렇지 않을 때 우아하게 폴백할 수 있음을 의미합니다.
개념적으로 추론 루프는 이렇게 보입니다:
// 의사 코드: 세션 로드, 텐서 입력, 출력 텐서 읽기
const session = await ort.InferenceSession.create("/models/segmentation.onnx");
const feeds = { input: inputTensor };
const results = await session.run(feeds);
const mask = results.output; // canvas / WASM 글루에서 사용
스택의 Go와 WASM 레이어는 얇게 유지됩니다: 바이트를 이동하고, 진행률을 노출하고, 비즈니스 규칙을 internal/apps/ai2done/tool에 보관 —— 모델 런타임 내부가 아닙니다.
메모리, 텐서, 그리고 정직함
신경망은 배가 고픕니다. 잘못된 가정 —— 5년 된 노트북에 "전체 해상도 모든 것" 모델을 로드하는 것 —— 은 탭 충돌과 화난 사용자를 만듭니다. 우리는 다음으로 그것을 완화합니다:
- 품질이 허용하는 경우 모델 양자화
- UI가 응답성을 유지하도록 점진적 로딩
- 사용자가 볼 수 있는 메시지와 함께 입력 크기에 대한 명확한 상한선
이것은 PDF 및 비디오 WASM에 적용하는 것과 같은 철학입니다: 웹이 데이터센터라고 가정하는 대신 브라우저 한도를 존중합니다.
기술적 보장으로서의 프라이버시
추론이 로컬에서 실행될 때 프라이버시 이야기는 스스로 쓰여집니다. 이미지는 향상을 위해 우리 디스크에 닿지 않습니다 —— 우리가 배너에서 부드럽게 약속해서가 아니라, 그 작업을 위해 아키텍처에 업로드 경로가 없기 때문입니다. 그 구별은 규제된 환경과 단순히 휴가 사진을 낯선 사람의 GPU에 두고 싶지 않은 모든 사람에게 중요합니다.
Go가 들어맞는 곳
우리는 여전히 오케스트레이션, 정적 서빙, WASM 번들 임베딩에 Go를 좋아합니다. 정신 모델은 깨끗합니다: Go가 앱을 출하하고, JS가 ONNX를 브리지하며, 서버와의 공유 코드가 가치 있는 곳에서 WASM이 결정론적 변환을 처리합니다. DDD 경계는 각 레이어를 정직하게 유지합니다 —— 도메인 로직은 tool/에, 서비스는 요청을 조정하고, "스마트" 템플릿은 없습니다.
실세계 드리프트 디버깅
모델은 기기마다 다르게 동작합니다: 색상 프로파일, WebGPU 가용성 및 부동 소수점 특이성이 출력을 미묘하게 이동시킬 수 있습니다. 엣지 케이스를 잡기 위해 대표적인 입력에 대한 골든 파일 테스트와 텔레메트리 없는 사용자 피드백(말 그대로: 픽셀을 유출하지 않는 "문제 보고")에 투자합니다.
미래 전망
기기 내 ML은 브라우저가 더 많은 성능을 노출하고 모델이 축소됨에 따라 계속 개선될 것입니다. Ai2Done은 미디어를 다른 사람의 학습 데이터로 만들지 않고 그 물결을 계속 탈 것입니다. 브라우저에서 ONNX를 평가하는 엔지니어라면 우리의 조언은 간단합니다: 메모리와 폴백을 최고 수준의 요구사항으로 다루십시오, 그러면 사용자가 차이를 느낄 것입니다.