Greed.js: WebGPU 가속을 지원하는 브라우저 기반 PyTorch 실행 엔진

Greed.js 소개

Greed.js는 브라우저 환경에서 PyTorch 코드를 직접 실행할 수 있게 해주는 혁신적인 JavaScript 라이브러리입니다. 기존의 웹 기반 머신러닝 라이브러리와 달리, WebGPU를 활용하여 PyTorch 연산을 네이티브 GPU 가속으로 처리한다는 점이 가장 큰 특징입니다. 이를 통해 사용자는 별도의 서버나 복잡한 설치 과정 없이 브라우저 내에서 순수 Python 코드로 딥러닝 모델을 학습하거나 추론할 수 있습니다.

이 프로젝트의 이름인 Greed는 '탐욕'이라는 7대 죄악에서 유래했지만, 여기서는 더 높은 성능과 기능에 대한 끊임없는 갈망을 의미합니다. 머신러닝 분야에서 항상 한계에 도전하고 더 많은 것을 원하는 개발자들의 철학을 담고 있습니다.

최근 브라우저에서 AI 모델을 실행하려는 시도(예: TensorFlow.js, ONNX Runtime Web)가 늘어나고 있습니다. 하지만 Python 생태계의 표준인 PyTorch를 브라우저에서 직접 돌리면서 GPU 가속까지 챙기는 것은 쉽지 않은 과제였습니다. Pyodide가 브라우저에서 Python 실행을 가능하게 했지만 주로 CPU에 의존했습니다. Greed.js는 이 갭을 메우기 위해 등장했으며, PyTorch 연산을 가로채 최적화된 WebGPU 쉐이더(Compute Shader)로 실행함으로써 성능을 극대화합니다.

Pyodide와의 비교

Greed.js는 기존의 Python-in-Browser 솔루션인 Pyodide와 비슷하게 느껴질 수 있지만, 근본적인 실행 방식에서 차이가 있습니다. 먼저 Pyodide는 WebAssembly(WASM)를 사용하여 브라우저에서 Python 런타임을 구동합니다. 훌륭한 호환성을 자랑하지만, 무거운 행렬 연산을 CPU에서 처리해야 하므로 딥러닝 모델 구동 시 성능 제약이 큽니다.

이에 비해 Greed.js는 Pyodide와 통합되어 Python 문법을 그대로 사용하지만, PyTorch 연산(torch.*) 이 호출되면 이를 가로채 WebGPU Compute Shader로 실행합니다. 즉, 문법은 Python이지만 연산은 GPU가 담당하여 진정한 하드웨어 가속을 제공합니다. 그 결과 Greed.js(v3.1.0 기준)는 GPU 가속 활성화 시 상당한 속도 향상(문서상 8.8배 가속 언급)을 제공합니다. 또한, WebGPU를 사용할 수 없는 환경에서는 자동으로 CPU 또는 Worker 스레드로 전환되는 지능형 폴백 시스템을 갖추고 있습니다.

Greed.js의 주요 기능

WebGPU 기반의 PyTorch 가속

Greed.js의 핵심은 50개 이상의 최적화된 WGSL(WebGPU Shading Language) 쉐이더를 내장하고 있다는 점입니다. 사용자가 torch.matmul이나 torch.conv2d 같은 함수를 호출하면, 브라우저는 이를 그래픽 카드의 연산 유닛을 통해 병렬 처리합니다. 이를 통해 텐서 연산, 신경망 레이어(nn.Module), 손실 함수 계산 등 완전한 PyTorch 생태계를 브라우저 클라이언트 사이드에서 구현할 수 있습니다.

Notebook 스타일의 상태 유지 (State Persistence)

데이터 과학자들에게 익숙한 Jupyter Notebook과 유사한 실행 경험을 제공합니다. 예를 들어, greed.run()을 여러 번 나누어 호출하더라도 이전 셀에서 정의한 변수(a = 5)나 모델(model = MyNet())이 메모리에 유지됩니다.

이러한 상태 유지 기능을 통해 단계별로 모델을 정의하고, 데이터를 로드하고, 학습을 수행하는 인터랙티브한 웹 애플리케이션을 쉽게 구축할 수 있습니다.

모듈러 아키텍처 (Architecture)

Greed.js v3.1은 유지보수와 성능을 위해 철저하게 모듈화되어 설계되었습니다. 주요 모듈들은 다음과 같습니다:

┌─────────────────────────────────────────────────────────┐
│                      Greed Core                         │
│  (Orchestration, Events, Public API)                    │
└────────┬────────────────────────────────────┬───────────┘
         │                                    │
    ┌────▼──────────┐                   ┌────▼──────────┐
    │ RuntimeManager│                   │ComputeStrategy│
    │  - Pyodide    │                   │  - WebGPU     │
    │  - Packages   │                   │  - CPU        │
    │  - Execution  │                   │  - Workers    │
    └────┬──────────┘                   └────┬──────────┘
         │                                    │
    ┌────▼──────────┐                   ┌────▼──────────┐
    │MemoryManager  │                   │SecurityValida-│
    │  - GC         │                   │tor            │
    │  - Monitoring │                   │  - Validation │
    │  - Cleanup    │                   │  - Threat Det.│
    └───────────────┘                   └───────────────┘
  • RuntimeManager: Pyodide 초기화, 패키지 관리, Python 실행을 담당합니다. 필요한 Python 패키지를 동적으로 설치할 수도 있습니다.
  • ComputeStrategy: 하드웨어 환경을 분석하여 WebGPU, CPU, Web Worker 중 최적의 실행 전략을 자동으로 선택합니다.
  • MemoryManager: 브라우저 환경은 메모리에 민감합니다. 자동 가비지 컬렉션(GC)과 메모리 압박 모니터링을 통해 리소스를 효율적으로 관리합니다.
  • SecurityValidator: 클라이언트 사이드 실행의 보안을 위해 입력값 검증 및 위협 탐지 시스템이 내장되어 있습니다.

Greed.js 설치 및 사용

Greed.js는 npm이나 yarn을 통해 설치하거나, CDN을 통해 직접 로드할 수 있습니다:

# npm으로 설치 시
npm install greed.js
# yarn 으로 설치 시
yarn add greed.js
<!-- CDN 사용 시 -->
<script src="https://cdn.jsdelivr.net/pyodide/v0.24.1/full/pyodide.js"></script>
<script src="https://unpkg.com/greed.js@3.1.0/dist/greed.min.js"></script>


다음은 Pyodide와 Greed.js를 불러온 다음, Python 코드를 실행하는 예제입니다:

<script src="https://cdn.jsdelivr.net/pyodide/v0.24.1/full/pyodide.js"></script>
<script type="module">
  import Greed from 'https://unpkg.com/greed.js@3.1.0/dist/greed.js';

  async function main() {
    // WebGPU 활성화 및 초기화
    const greed = new Greed({ enableWebGPU: true });
    await greed.initialize();

    // 1. 변수 정의 (Python 코드 실행)
    await greed.run(`
      import torch
      # WebGPU 디바이스 자동 사용
      x = torch.randn(1000, 1000, device='webgpu')
      y = torch.randn(1000, 1000, device='webgpu')
    `);

    // 2. 연산 수행 및 결과 출력
    const result = await greed.run(`
      # GPU 가속 행렬 곱셈
      result = torch.matmul(x, y)
      print(f"Result shape: {result.shape}")
      result.mean().item()
    `);
    
    console.log('JS Result Object:', result);
  }
  main();
</script>

Greed.js의 주요 메서드

  • greed.initialize(): 모든 컴포넌트와 PyTorch 환경을 초기화합니다.
  • greed.run(code, options): Python 코드를 실행하고 상태를 유지합니다. options를 통해 보안 설정이나 타임아웃을 지정할 수 있습니다.
  • greed.clearState(): 사용자 변수를 초기화하여 메모리를 정리합니다(라이브러리 임포트는 유지).

더 상세한 API 소개는 GitHub 저장소 README의 API Reference 섹션을 참고해주세요.

:github: Greed.js 프로젝트 GitHub 저장소

https://github.com/Deep-ML-codebase/greed

더 읽어보기




이 글은 GPT 모델로 정리한 글을 바탕으로 한 것으로, 원문의 내용 또는 의도와 다르게 정리된 내용이 있을 수 있습니다. 관심있는 내용이시라면 원문도 함께 참고해주세요! 읽으시면서 어색하거나 잘못된 내용을 발견하시면 덧글로 알려주시기를 부탁드립니다. :hugs:

:pytorch:파이토치 한국 사용자 모임:south_korea:이 정리한 이 글이 유용하셨나요? 회원으로 가입하시면 주요 글들을 이메일:love_letter:로 보내드립니다! (기본은 Weekly지만 Daily로 변경도 가능합니다.)

:wrapped_gift: 아래:down_right_arrow:쪽에 좋아요:+1:를 눌러주시면 새로운 소식들을 정리하고 공유하는데 힘이 됩니다~ :star_struck:

1개의 좋아요