JAX
빠르게 변화하는 기계 학습 및 과학 컴퓨팅 분야에서 가장 필요한 두 가지 주요 요소는 작업 속도와 유연성입니다. 구글 리서치 팀에서 개발한 JAX라는 프로그램은 수치 컴퓨팅과 딥 러닝 분야에서 속도 향상을 추구하면서 가장 많이 알려진 도구입니다. JAX는 기본적인 NumPy의 모든 기능을 갖추고 있을 뿐만 아니라 자동 차별화와 같은 가장 고급 기능을 갖춘 매우 친숙한 언어를 도입하여 최신 GPU/TPU에 최적화된 머신 러닝 워크로드와 코드를 실행할 수 있으며 적시 컴파일도 가능합니다. 이 백서에서는 JAX를 가장 적합하게 사용하는 방법을 찾고, 실제 기능과 주장된 기능을 비교하며, 이 주제를 처음 접하는 분들에게 적합한 간단한 튜토리얼을 제공합니다.
JAX란 무엇인가요?
JAX는 최신 머신 러닝과 과학 컴퓨팅의 생산성을 향상시키는 다양한 기능을 통합하기 위해 NumPy 기능을 확장한 강력한 수치 컴퓨팅 라이브러리입니다. JAX는 이전 라이브러리와 달리 함수 전달을 체계화하는 데 중점을 두고 있어 연구자와 엔지니어가 작성하는 코드를 짧고 강력하게 만드는 데 도움이 됩니다. JAX의 주요 특징은 자동 차별화 지원, 하드웨어 가속, 기존 Python 워크플로우와의 손쉬운 통합입니다.
JAX의 주요 속성
JAX는 다음과 같은 고유한 특성으로 인해 다른 숫자 계산 툴킷과 다릅니다:
NumPy 호환성: JAX는 NumPy가 제공하는 대부분의 배열 연산을 지원합니다. 따라서 사용자는 NumPy 연산을 사용할 때 기존 코드를 버릴 필요가 없으며 GPU/TPU 가속의 이점도 누릴 수 있습니다.
자동 차별화: JAX는 라이브러리의 일부로 역방향 및 정방향 모드 자동 차별화를 제공함으로써 머신 러닝 및 최적화 애플리케이션을 위한 힘든 그라디언트 계산의 진입 장벽을 낮춥니다.
JIT(Just-In-Time 컴파일): JIT 데코레이터의 기능 중 하나는 파이썬 함수를 효율적인 머신 코드로 직접 컴파일하여 성능을 크게 향상시킬 수 있는 기능입니다.
하드웨어 가속: 코드 변경 없이도 JAX는 간단한 연구 작업부터 대규모 연구 작업까지 CPU, GPU, TPU에서 원활하게 작동할 수 있습니다.
함수 변환: grad, vmap, pmap과 같은 고효율 도구는 벡터화, 병렬화, 자동 일괄 처리를 통해 함수를 변환(따라서 최적화)할 수 있을 뿐만 아니라 쉽고 빠른 방식으로 변환을 수행할 수 있습니다.
JAX 시작하기: 기본 튜토리얼
이 사례에서는 JAX의 자동 차별화 및 JIT 컴파일 기능을 소개하는 짧은 예제를 제공하고자 합니다.
우선, JAX는 pip를 통해 설치해야 합니다:
pip 설치 잭스 잭스 라이브러리
그런 다음 필요한 모듈을 가져와야 합니다:
jax 가져오기
jax.numpy를 jnp로 가져오기
FROM JAX 가져오기 GRAD, JIT
어떤 함수의 기울기를 찾기 전에 이해하기 쉽고 설명하기 쉬운 함수를 선택하는 것이 좋습니다:
def f(x):
반환 3 * x ** 2 + 2 * x + 1
DF_DX = GRAD(F)
print(df_dx(2.0)) # 출력: 14.0
이제 JIT 컴파일을 통해 더 빠르게 실행할 수 있습니다:
@jit
def fast_f(x):
반환 3 * x ** 2 + 2 * x + 1
print(fast_f(2.0)) # 출력: 17.0
이 튜토리얼에서는 JAX가 그라디언트를 찾는 데 얼마나 뛰어난지 그 이상을 보여줍니다. 이러한 연산을 핵심으로 하는 JAX는 배치 또는 디바이스 병렬화 작업을 위해 vmap과 pmap을 제공합니다.
결론
JAX는 NumPy의 사용 편의성과 최신 성능 최적화를 결합한 배열 컴퓨팅 분야의 주요한 발전입니다. 함수형 프로그래밍을 다루는 방법을 배우는 것은 극복해야 할 작은 장애물이지만, 그 결과 얻을 수 있는 속도와 적응성은 상당한 보람을 줍니다. 머신 러닝 모델 훈련, 과학 시뮬레이션, 수학 함수 최적화 등 어떤 분야에서든 JAX는 Python에서 가능한 것의 한계를 뛰어넘는 데 도움이 되는 도구입니다.