AI 는 파이썬으로 짜는데 인프라는 왜 Rust 로 가나

요즘 AI 쪽에서 파이썬 코드 밑을 Rust 로 바꾸는 경우가 부쩍 많아졌어요. 모델은 여전히 파이썬으로 짜는데 왜 그 속만 갈아 끼우는지, 나는 언제 Rust 를 꺼내면 되는지 정리했어요.

AI 모델은 거의 다 파이썬으로 만들어요. PyTorch 도, 노트북도, 논문 코드도 파이썬이에요. 그런데 요즘 AI 쪽 오픈소스를 열어 보면 이상한 게 보여요. 토크나이저, 모델 파일 포맷, 데이터프레임, 추론 서버, 벡터 DB 의 속이 Rust 로 바뀌고 있어요.

파이썬이 이렇게 잘나가는데 왜 그 밑은 다른 언어로 옮겨 갈까요. 답은 "파이썬이 실제로 하는 일"을 한 겹 벗겨 보면 나와요.

파이썬 코드 밑에서 실제로 일하는 것

model(x) 한 줄을 실행하면 파이썬이 행렬 곱셈을 하는 게 아니에요. 파이썬은 "이 계산을 해라"라고 지시만 하고, 실제 계산은 아래층이 해요.

코드
파이썬  — 무엇을 할지 정한다
  ↓
C++     — PyTorch 본체, 연산을 쪼갠다
  ↓
CUDA    — GPU 에서 돌 커널
  ↓
GPU     — 실제로 곱하고 더한다

그래서 파이썬이 느려도 모델 학습은 빨라요. 무거운 일은 전부 C++ 과 GPU 가 하니까요. 파이썬은 지휘자예요. 악기는 안 불어요.

문제는 GPU 가 아니라 그 앞에 있다

GPU 는 비싸요. 그런데 비싼 GPU 가 생각보다 자주 놀아요. 다음 데이터를 기다리느라요.

모델에 들어가기 전에 해야 할 일이 많아요. 파일을 읽고, 텍스트를 토큰으로 자르고, 이미지를 줄이고, 배치로 묶어요. 이건 전부 CPU 일이에요. 이 단계가 파이썬으로 짜여 있으면 여기서 막혀요. GPU 는 1초에 수천 개를 처리할 수 있는데, 앞에서 수백 개씩밖에 못 넘겨주는 거예요.

파이썬이 이런 일에 약한 이유는 두 가지예요.

  • 느린 반복문. 파이썬은 한 줄 한 줄 해석하며 실행해서, 수백만 번 도는 단순 반복이 컴파일 언어보다 수십 배 느려요.
  • GIL. 파이썬 인터프리터는 한 번에 한 스레드만 파이썬 코드를 돌리게 막는 잠금(GIL)이 있어요. CPU 코어가 16개여도 순수 파이썬 코드는 사실상 한 코어로 돌아요. 3.13 에서 GIL 없는 빌드가 실험으로 나왔고 3.14 에서 정식 지원이 됐지만, 아직 기본값은 아니에요.

그래서 "GPU 앞의 CPU 일"을 빠른 언어로 내려보내야 해요. 예전엔 그 자리가 당연히 C++ 이었어요. 요즘은 Rust 가 그 자리를 많이 가져가고 있어요.

왜 하필 Rust 인가

C++ 도 빠른데 굳이 Rust 를 고르는 이유는 이래요.

1. 쓰레기 수거기 없이 빠르다. Rust 는 C++ 처럼 기계어로 컴파일되고, 자바나 Go 처럼 실행 중에 메모리를 정리하느라 멈추는 시간(GC)이 없어요. 응답 시간이 들쭉날쭉하면 안 되는 추론 서버에서 이게 중요해요.

2. 메모리 사고를 컴파일러가 막는다. C++ 로 짠 코드의 큰 골칫거리는 이미 해제한 메모리를 쓰거나, 배열 끝을 넘어 쓰는 실수예요. 이런 버그는 가끔만 터지고, 터지면 보안 구멍이 돼요. Rust 는 소유권 규칙으로 이런 코드를 아예 컴파일이 안 되게 막아요. 빠른 것과 안전한 것을 같이 가져가는 거예요.

3. 병렬이 안전하다. 여러 스레드가 같은 데이터를 동시에 고치다 꼬이는 버그(데이터 경쟁)도 Rust 컴파일러가 잡아요. GIL 같은 잠금 없이 코어를 전부 쓸 수 있어서, 앞에서 말한 "GPU 앞의 CPU 일"에 딱 맞아요.

4. 메모리 모양을 직접 정할 수 있다. 데이터를 메모리에 어떤 순서로 놓을지 손으로 정할 수 있어요. 그래서 파일을 복사하지 않고 그대로 메모리에 비춰서 읽거나(제로카피), 다른 프로그램과 같은 메모리 모양(Apache Arrow)을 공유할 수 있어요.

5. 파이썬에 붙이기 쉽다. 이게 결정적이에요. PyO3 라는 도구로 Rust 함수를 파이썬 함수처럼 내보내고, maturin 으로 묶으면 pip install 한 줄로 설치되는 패키지가 돼요. 쓰는 사람은 속이 Rust 인 줄도 몰라요.

코드로 보면

Rust 쪽에서 함수 하나를 파이썬에 내보내는 모양이에요.

rust
use pyo3::prelude::*;

#[pyfunction]
fn count_words(text: &str) -> usize {
    text.split_whitespace().count()   // 이 반복은 Rust 속도로 돈다
}

#[pymodule]
fn fastwords(m: &Bound<'_, PyModule>) -> PyResult<()> {
    m.add_function(wrap_pyfunction!(count_words, m)?)?;
    Ok(())
}

maturin develop 로 빌드하면 파이썬에서는 이렇게 써요.

python
import fastwords
fastwords.count_words("파이썬은 지휘하고 Rust 는 연주한다")   # → 5

파이썬 쪽 코드는 그대로예요. 느린 한가운데만 Rust 로 갈아 끼운 거예요.

이미 쓰고 있는 Rust

"AI 에 Rust 라니 먼 얘기"처럼 들려도, 파이썬으로 AI 를 하는 사람이라면 이미 매일 Rust 를 돌리고 있어요.

도구무엇Rust 가 맡은 부분
Hugging Face tokenizers텍스트를 토큰으로 자르기핵심 전부. 파이썬은 껍데기
safetensors모델 가중치 파일 포맷파일 읽기·쓰기. 복사 없이 메모리에 바로 비춰 읽음
tiktokenOpenAI 모델의 토크나이저토큰화 엔진
Polars데이터프레임(판다스 대체)엔진 전부. 여러 코어로 병렬 처리
Pydantic v2데이터 검증검증 엔진(pydantic-core)을 Rust 로 다시 씀
uv · Ruff파이썬 패키지 관리 · 린터도구 전부
Qdrant · LanceDB벡터 DBDB 엔진
Text Generation InferenceHugging Face 의 LLM 추론 서버요청을 받아 배치로 묶는 서버 쪽
Candle · BurnRust 로 쓴 머신러닝 프레임워크전부 — 파이썬 없이 추론까지

safetensors 는 속도만의 이야기가 아니에요. 예전 PyTorch 모델 파일(pickle)은 열기만 해도 그 안에 숨긴 코드가 실행될 수 있었어요. 남이 올린 모델을 내려받아 여는 게 곧 남의 프로그램을 실행하는 거였죠. safetensors 는 숫자 배열만 담는 단순한 포맷이라 그런 일이 생길 수 없어요. "빠르게"와 "안전하게"를 같이 노린 Rust 의 성격이 그대로 드러난 사례예요.

그럼 파이썬은 밀려나나

아니에요. 둘은 서로 다른 층에서 일해요.

  • 연구 층 — 모델 구조를 바꿔 보고, 실험을 돌리고, 결과를 그래프로 그리는 곳이에요. 빨리 고쳐 보는 게 중요해서 파이썬이 계속 맞아요. 여기를 Rust 로 짜면 실험 한 번 할 때마다 컴파일러와 씨름해야 해요.
  • 시스템 층 — 토큰화, 데이터 로딩, 파일 포맷, 추론 서버, DB 처럼 한 번 잘 만들어 두고 수백만 번 도는 곳이에요. 빠르고 안 죽는 게 중요해서, 원래 C++ 자리였고 지금은 Rust 가 많이 가져가고 있어요.

그래서 실제 모습은 "Rust 가 파이썬을 대체한다"가 아니라 "파이썬 겉, Rust 속" 이에요. 사람은 파이썬으로 말하고, 파이썬 패키지 속의 Rust 가 일해요. Rust 가 밀어내는 건 파이썬이 아니라 그 밑에 있던 C++ 의 일부예요.

파이썬은 무엇을 할지 말하고, Rust 는 그것을 빠르고 안전하게 한다.

그래서 언제 Rust 를 꺼내나

파이썬으로 일하는 입장에서 현실적인 순서는 이래요.

  1. 먼저 재 본다. 느린 곳이 정말 CPU 쪽 반복인지, 아니면 네트워크·디스크·GPU 대기인지부터 봐요. 짐작으로 갈아 끼우면 대개 헛수고예요.
  2. Rust 로 된 기존 도구를 먼저 쓴다. 판다스가 느리면 Polars, 토큰화가 느리면 tokenizers 처럼 이미 있는 걸 갈아 끼우는 게 제일 싸요. 직접 Rust 를 짤 필요가 없어요.
  3. 그래도 남는 한가운데만 직접 짠다. 수백만 번 도는 핵심 함수 하나를 PyO3 로 옮기고, 나머지는 파이썬에 둬요.

정리하면, AI 인프라가 Rust 로 가는 건 유행이 아니라 계산이에요. GPU 는 비싸고, 그 GPU 를 놀리지 않으려면 앞단의 CPU 일이 빨라야 하고, 그 코드는 수백만 번 돌아도 터지면 안 돼요. 그 세 조건을 한 언어로 맞춘 게 지금은 Rust 예요.


이 글은 영상 Why AI Infrastructure Is Moving to Rust(Byte Without Bite, 2026-10-15)의 흐름을 따라 정리했어요. 도구별 설명은 각 프로젝트의 공식 저장소를 기준으로 했어요 — tokenizers · safetensors · tiktoken · Polars · pydantic-core · PyO3 · maturin · Candle · Burn.

자주 묻는 것

Rust 함수를 파이썬에서 쓰려면 어떻게 하나요?

PyO3 로 Rust 함수를 파이썬 함수처럼 내보내고, maturin 으로 묶으면 pip install 한 줄로 설치되는 패키지가 돼요. 쓰는 쪽 파이썬 코드는 그대로예요.

브루니가 적어요

색을 바꾸며 숨는 카멜레온이에요. 운영에서 실제로 터지는 문제를 한 편씩 적어요. 같은 실수를 두 번 하지 않으려고 쓰는 기록이에요.

장애·확장 글 23편 모두 보기 →