Tenstorrent 개발자 가이드 (한국어) — 설치 · TT-NN · Metalium · TT-XLA · TT-Lang · 배포
Tenstorrent NPU · 한국어 개발자 가이드

Tenstorrent에서
모델을 실행하고
커널을 작성하다

PyTorch·GPU 경험이 있는 개발자가 Tenstorrent NPU를 처음부터 끝까지 익히도록 만든 한국어 가이드입니다. 설치부터 고수준 TT-NN, 저수준 TT-Metalium, 프론트엔드 TT-XLA, 커널 DSL TT-Lang, 그리고 모델 선택·vLLM 배포까지 — 공식 리포지터리와 문서의 실제 코드를 그대로 임베드하고, 개념 이해 → 예제 실행 → 직접 구축의 학습 경로로 엮었습니다.

대상 · Tenstorrent 입문 개발자 언어 · Python · C++ 하드웨어 · Grayskull · Wormhole · Blackhole 출처 · tenstorrent/tt-metal
학습 경로 · 사용법

여기서 시작하세요 — PyTorch 개발자를 위한 학습 경로

이 페이지는 Python·PyTorch·GPU 경험이 있지만 Tenstorrent는 처음인 개발자를 위해 설계되었습니다. 아래 순서대로 따라가면 개념 이해 → 예제 실행 → 직접 포팅/커널 작성까지 도달합니다. 개념이 막히면 용어집·치트시트·FAQ를 참고하세요.

사전 지식 · Python · PyTorch · GPU 경험 예상 시간 · 핵심 경로 4~6시간 목표 · 이해 → 실행 → 직접 구축 진행률 · 자동 저장(체크박스)
00 시작하기 전에

하드웨어와 프로그래밍 모델 이해하기

코드를 읽기 전에, Tenstorrent 프로세서가 다른 가속기와 어떻게 다른지 짚고 갑니다. 이 개념들은 TT-NN과 TT-Metalium 모두에서 반복해서 등장합니다.

Tenstorrent의 AI 프로세서는 Tensix 코어들이 2차원 그리드 형태로 배열된 구조입니다. GPU처럼 하나의 거대한 SIMD 유닛이 아니라, 각각 독립적으로 프로그래밍 가능한 코어들이 NoC(Network-on-Chip)로 연결되어 있습니다. 각 Tensix 코어 안에는 5개의 RISC-V 코어가 들어 있고, 역할이 명확히 나뉩니다.

단일 Tensix 코어의 내부 구조
RISCV_0
데이터 무브먼트
UNPACK
컴퓨트
MATH
컴퓨트
PACK
컴퓨트
RISCV_1
데이터 무브먼트
FPU행렬 엔진 · matmul, add, reduce
SFPU벡터 엔진 · exp, sqrt, sin, relu…
L1 SRAM  코어 내부 스크래치패드 · Wormhole/Blackhole 기준 1.5 MB · 타일 단위 데이터 저장
▲ 2개의 데이터 무브먼트 코어가 NoC를 통해 DRAM ↔ L1 데이터를 옮기고, 3개의 컴퓨트 코어가 협력하여 FPU/SFPU를 구동합니다.
// TILE

타일(Tile) — 32×32

하드웨어의 거의 모든 연산은 32×32 값으로 이루어진 타일 단위로 이루어집니다. bfloat16 기준 한 타일은 32×32×2 = 2048바이트입니다. 텐서를 디바이스에 올릴 때 TILE_LAYOUT으로 변환하고, 32의 배수가 아닌 크기는 자동으로 패딩됩니다.

// MEMORY

L1(SRAM) vs DRAM

L1은 각 Tensix 코어 안에 있는 빠르고 작은 스크래치패드입니다(CPU의 L1 캐시와는 다릅니다). DRAM은 크지만 느립니다. 성능의 핵심은 데이터를 L1에 가깝게 유지하고 DRAM 왕복을 줄이는 것입니다.

// PIPE

서큘러 버퍼(Circular Buffer)

커널 사이의 통신 채널입니다. 리더 커널이 타일을 밀어넣고(push) 컴퓨트 커널이 꺼내(pop) 쓰는 FIFO 파이프입니다. Tensix 하나당 최대 32개까지 사용할 수 있으며, 더블 버퍼링으로 데이터 이동과 연산을 겹칩니다.

// ENGINE

FPU vs SFPU

FPU(행렬 엔진)는 matmul·덧셈·리덕션 같은 무거운 연산을 담당하고, SFPU(벡터 엔진)는 exp·sqrt·sin·ReLU 같은 복잡한 원소별 함수를 담당합니다. 커널에서 어떤 엔진을 쓰느냐에 따라 API가 달라집니다.

또한 TT-Metalium의 최신 API는 단일 디바이스도 1×1 메시(Mesh)로 취급합니다. MeshDevice, MeshCommandQueue, MeshBuffer를 사용하면 코드를 바꾸지 않고도 1개에서 수백 개의 디바이스로 확장할 수 있습니다. 모든 연산(업/다운로드, 프로그램 실행)은 커맨드 큐(Command Queue)에 순서대로 쌓여 비동기로 실행됩니다.

TT-NN이 지원하는 데이터 타입

타입비트용도트레이드오프
float3232고정밀 부동소수점정확도 높음, 메모리 많음
bfloat1616신경망 표준준수한 정확도, 메모리 2배 절약
bfloat8_b8추론, 대형 모델메모리 4배 절약, 정확도 하락
bfloat4_b4초경량 추론메모리 8배 절약, 최저 정확도
uint16 / uint3216 / 32정수 연산인덱싱·마스킹 등
◈ 정밀도(Math Fidelity)

FPU는 LoFiHiFi2HiFi3HiFi4의 4단계 정밀도 모드를 제공합니다. LoFi는 가장 빠르고 부정확하며, HiFi4는 완전한 FP32 누산으로 가장 정확합니다. 예제들에서 MathFidelity::HiFi4가 자주 등장하는 이유입니다.

GPU/PyTorch에서 오셨나요? — 개념 대응표

이미 GPU와 PyTorch에 익숙하다면 Tenstorrent 개념을 익숙한 것에 대응시켜 이해하는 편이 빠릅니다. 가장 큰 차이는 암묵적 SIMT 스케줄링(GPU) 대신 명시적 데이터 이동 + 정적 코어 분배(Tenstorrent)라는 점입니다.

GPU / PyTorchTenstorrent차이점
CUDA core / SMTensix 코어각 Tensix는 5개 RISC-V + FPU·SFPU. 워프 스케줄링이 아니라 명시적 데이터 이동으로 동작합니다.
warp / thread block코어 그리드 + 정적 분배동적 스케줄링·오버서브스크립션 없음. 코어 수만큼만 병렬이며 작업을 직접 나눕니다.
VRAM (HBM/GDDR)DRAM칩 외부 대용량 메모리 — 개념은 동일합니다.
shared memory / L1L1 (SRAM · 코어당)코어 내부 스크래치패드. 성능의 핵심은 데이터를 L1에 붙잡아 두는 것입니다.
tensor (row-major)타일 32×32 · TILE_LAYOUT하드웨어가 32×32 타일 단위로 연산. 올릴 때 타일 레이아웃으로 변환합니다.
fp16 / bf16bfloat16 · bfloat8_b · bfloat4_b블록 부동소수점으로 8·4비트까지 — 메모리·대역폭을 크게 절감합니다.
cuBLAS / cuDNNTT-NN 연산ttnn.matmul·ttnn.conv2d 등 즉시 쓰는 고수준 연산.
CUDA 커널 작성TT-Metalium · TT-Lang리더·컴퓨트·라이터 커널 + 서큘러 버퍼로 명시적 파이프라인을 구성합니다.
CUDA GraphMetal Trace연산 시퀀스를 녹화·재생해 호스트 오버헤드를 제거합니다.
NCCL (multi-GPU)CCL + TT-Fabric (mesh)all_gather·all_reduce로 멀티 디바이스 확장.
torch.compile / XLATT-XLA (PJRT)기존 JAX/PyTorch-XLA 그래프를 그대로 컴파일해 실행합니다.
◈ 가장 큰 사고방식 전환

GPU에서는 스케줄러가 알아서 워프를 배분하지만, Tenstorrent에서는 어떤 코어가 어떤 타일을 언제 처리할지를 프로그래머(또는 TT-NN 같은 상위 계층)가 결정합니다. 그래서 "데이터 이동"과 "타일"이 이 페이지 전반의 핵심 주제입니다.

01 시작하기 · 설치

설치 & 환경 구성 — tt-installer

한 줄 명령으로 드라이버·펌웨어·관리 도구까지 전체 Tenstorrent 스택 설치하기

Tenstorrent 가속기를 처음 받으면 가장 먼저 드라이버·펌웨어·관리 도구를 포함한 소프트웨어 스택을 설치해야 합니다. 공식 tt-installer 스크립트는 이 과정을 한 줄 명령으로 자동화합니다.

이 절에서는 지원 OS와 BIOS 요구사항, 한 줄 설치 명령, 설치 마법사가 순서대로 묻는 것들, 가상환경 활성화, tt-smi·lspci를 이용한 검증, 장치 리셋, 그리고 장치가 안 잡힐 때의 문제 해결까지 공식 문서의 명령을 그대로 정리합니다.

// STACK

스택 구성 요소

tt-kmd(커널 드라이버), tt-flash(펌웨어), tt-smi(관리·텔레메트리), HugePages, Python venv가 한 세트로 설치됩니다.

// ONE-LINE

한 줄 프로비저닝

curl로 최신 install.sh를 받아 실행하면 전체 스택을 자동 설치합니다. 의존성은 curl과 jq뿐입니다.

// VERIFY

검증과 리셋

tt-smi로 장치 인식을 확인하고, lspci -d 1e52로 PCIe 열거를, tt-smi -r로 오류 상태를 초기화합니다.

// OS

지원 환경

Ubuntu 22.04 LTS 권장. Ubuntu·Debian·Fedora 지원(신규 배포판은 실험적). BIOS의 PCIe AER은 OS First로 설정.

Tenstorrent 소프트웨어 스택은 여러 계층으로 구성됩니다. 커널 모드 드라이버(tt-kmd)가 PCIe로 연결된 가속기를 리눅스 커널에 노출하고, tt-flash가 보드 펌웨어를 갱신하며, tt-smi가 시스템 관리·텔레메트리를 담당합니다. 그 위에 TT-Metalium/TT-NN 개발 환경이 올라갑니다. 이 모든 구성 요소를 손으로 하나씩 설치하는 대신, 공식 편의 스크립트 tt-installer가 한 줄로 전체 스택을 프로비저닝합니다.

사전 준비 — OS · 하드웨어 · BIOS

권장 운영체제는 Ubuntu 22.04 LTS이며 Ubuntu·Debian·Fedora도 지원됩니다(더 최신 배포판은 실험적). 그 외에 인터넷 연결(패키지 다운로드), 관리자(sudo) 권한, 제품 매뉴얼에 따른 물리적 설치 완료가 필요합니다. 또한 BIOS에서 PCIe AER Reporting 항목을 OS First로 설정해야 합니다(TT-QuietBox 시스템은 자동 설정).

tt-installer는 curljq 두 의존성만 필요합니다(일부 배포판은 기본 설치되어 있지 않음). 먼저 설치해 둡니다.

한 줄 설치 명령

아래 명령이 tt-installer의 최신 릴리스 스크립트를 내려받아 실행합니다. 이 스크립트는 패키지 설치, DKMS 커널 모듈 추가, HugePages 설정을 위해 슈퍼유저(sudo) 권한을 요구합니다.

◈ 임의 스크립트 실행 주의

curl로 받은 스크립트를 곧바로 파이프로 실행하는 방식은 편리하지만, 스크립트가 root 권한으로 커널 모듈을 추가하고 HugePages를 구성한다는 점에서 위험을 동반합니다. 내부 정책이 엄격하다면 install.sh를 먼저 파일로 내려받아 검토한 뒤 실행하세요.

설치 마법사가 순서대로 묻는 것

대화형 모드로 실행하면 스크립트는 다음을 차례로 진행합니다. (1) 진행 확인에 Y, (2) sudo 비밀번호 입력, (3) TT-Metalium Slim 컨테이너(tt-nn/tt-metalium 릴리스 빌드 포함) 설치 여부 — TT-NN/TT-Metalium 개발 시 Y, (4) 모델 데모 컨테이너(전체 tt-metal, 약 10GB) 설치 여부, (5) Python 패키지 위치 선택, (6) TT-KMD·TT-Flash·시스템 펌웨어·HugePages·TT-SMI 자동 설치, (7) 첫 설치 시 재부팅(필수).

(5) Python 설치 위치는 네 가지 중에서 고릅니다: active-venv(현재 활성 환경 사용), new-venv(기본값/home/$USER/.tenstorrent-venv 생성), system-python(비권장), pipx(격리 설치).

Python 가상환경 활성화

기본 설치는 ~/.tenstorrent-venv에 가상환경을 만듭니다. tt-smi 등 파이썬 도구를 쓰려면 이 venv를 활성화합니다.

설치 검증 — tt-smi & lspci

재부팅이 끝나면 tt-smi를 실행해 장치가 정상 인식되는지 확인합니다. 출력의 Device Information 섹션에 표시되는 장치 수가 실제 설치한 하드웨어 수와 일치해야 합니다. PCIe 수준의 열거는 lspci -d 1e52(1e52 = Tenstorrent 벤더 ID)로 확인합니다.

장치 리셋

장치가 오류 상태에 빠지거나 재실행 전 초기화가 필요하면 tt-smi -r로 리셋합니다(수 초 소요). 남아 있는 프로세스와 공유 메모리를 먼저 정리하면 더 확실합니다.

문제 해결 — 장치가 안 잡힐 때

"No Tenstorrent devices detected!"가 뜨는 경우, Blackhole 카드(p100/p150)라면 먼저 전원을 점검하세요: 부팅 시 팬 회전과 녹색 LED를 확인합니다. 전원이 정상인데도 안 잡히면 카드를 리셋하고, lspci -d 1e52 결과가 비어 있으면 PCIe 열거 자체가 실패한 것입니다(재장착·슬롯 변경을 검토).

◈ 다음 단계

설치가 끝나면 본격적인 개발로 넘어갑니다. TT-NN(02절~)으로 모델을 실행하거나, 배포가 목표라면 모델 선택 가이드vLLM 추론 서버로 이어집니다. 상태 모니터링은 tt-smi(스냅샷)와 tt-toplike(실시간)로 합니다.

02 TT-NN · Python

TT-NN 소개 — 디바이스, 텐서, 레이아웃

TT-NN은 성능을 위해 C++로 구현되고 Python 바인딩을 제공하는 고수준 딥러닝 프레임워크입니다. PyTorch와의 상호 운용성이 핵심 강점입니다.

가장 먼저 할 일은 디바이스를 여는 것입니다. TT-NN 텐서는 호스트(CPU)디바이스(Tenstorrent 하드웨어) 두 곳에 존재할 수 있고, ttnn.from_torch / ttnn.to_torch로 PyTorch와 자유롭게 오갑니다.

레이아웃: ROW_MAJOR vs TILE

TT-NN에는 두 가지 텐서 레이아웃이 있습니다. ROW_MAJOR_LAYOUT은 전통적인 행 우선 저장 방식이고, TILE_LAYOUT은 32×32 타일 기반 저장 방식입니다. 하드웨어는 타일 레이아웃에 최적화되어 있으므로, 고성능 연산은 대부분 타일 레이아웃을 요구합니다.

L1(SRAM) 직접 제어와 메모리 관리

TT-NN은 텐서를 느린 DRAM에 둘지 빠른 L1에 둘지 명시적으로 제어할 수 있습니다. 연산을 이어서 수행할 때는 중간 텐서를 ttnn.deallocate로 즉시 해제해 L1의 제한된 용량을 아끼는 것이 중요합니다.

◈ JIT 컴파일 & 캐시

TT-NN은 커널을 실행 시점에(JIT) 컴파일합니다. 따라서 첫 실행은 느리고(컴파일), 이후 실행은 캐시된 커널로 빠릅니다. 텐서의 shape·dtype·레이아웃이 바뀌면 새 컴파일이 트리거됩니다. 뒤의 어텐션 예제에서 "program cache" 덕분에 두 번째 반복이 빨라지는 것을 직접 확인할 수 있습니다.

Metal Trace & 멀티 디바이스

프로덕션 추론에서는 Metal Trace로 연산 시퀀스를 녹화·재생하여 Python 오버헤드를 제거하고, 메시 디바이스로 여러 칩에 텐서를 샤딩(sharding)해 모델·데이터 병렬화를 구현합니다.

◈ 추론 전용

TT-NN은 추론(inference)에 최적화되어 있으며 자동 미분(autograd)을 포함하지 않습니다. 학습이 필요하면 별도 프레임워크인 tt-train을 사용하세요.

03 TT-NN · Python

텐서 더하기 — 첫 번째 디바이스 연산

가장 단순한 예제입니다. 두 개의 타일 텐서를 디바이스에서 원소별로 더합니다. TT-NN의 "열기 → 텐서 생성 → 연산 → 닫기" 흐름을 익히세요.

여기서는 ttnn.full로 값이 채워진 32×32 텐서 두 개를 디바이스에서 직접 만들고, ttnn.add로 더합니다. 두 텐서 모두 TILE_LAYOUT이라는 점에 주목하세요 — 하드웨어 연산의 전제 조건입니다.

04 TT-NN · Python

기본 텐서 연산 — 생성, 곱셈, 브로드캐스트

덧셈·원소별 곱셈·행렬 곱, 그리고 PyTorch/NumPy로부터의 텐서 생성과 브로드캐스트를 한 번에 살펴봅니다.

PyTorch 텐서를 ttnn.from_torch로 올리고, ttnn.zeros·ttnn.ones·ttnn.full로 디바이스에 직접 만들 수 있습니다. 연산은 ttnn.add, ttnn.mul, ttnn.matmul처럼 PyTorch와 거의 같은 이름을 씁니다.

05 TT-NN · Python

행렬 곱셈 — 메모리 배치와 코어 그리드

1024×1024 행렬 곱을 통해 @ 연산자, 레이아웃 변환, 그리고 L1 배치 + 코어 그리드 지정으로 성능을 끌어올리는 법을 봅니다.

ttnn.rand로 디바이스에 큰 행렬을 만들고 파이썬 @ 연산자로 곱합니다. 결과는 타일 레이아웃이므로, 사람이 읽으려면 to_layout으로 ROW_MAJOR로 바꿉니다. 마지막에는 입력을 L1에 배치하고 core_grid8×8 = 64개 코어에 연산을 분배해 성능을 높입니다.

◈ 왜 core_grid 인가

TT-NN은 고수준 API지만, core_grid·memory_config 같은 인자로 저수준 하드웨어 자원(어느 코어에서, 어느 메모리를 쓸지)을 제어할 수 있습니다. 이 아이디어를 밑바닥부터 직접 구현하는 것이 뒤의 TT-Metalium 행렬 곱 예제입니다.

06 TT-NN · Python

Conv2D — 합성곱과 NHWC 레이아웃

TT-NN의 conv2d는 PyTorch의 BCHW가 아니라 NHWC 레이아웃을 기대합니다. 입력을 permute·reshape하여 넘기는 패턴을 익힙니다.

PyTorch의 이미지 텐서는 (batch, channel, height, width) 순서지만, TT-NN conv2d는 채널이 마지막인 NHWC를 원합니다. 그래서 ttnn.permute로 축을 바꾸고, 공간 차원을 평탄화한 뒤 ttnn.Conv2dConfig와 함께 호출합니다. 또한 open_devicel1_small_size를 지정하는 점도 눈여겨보세요.

07 TT-NN · PyTorch

모델 학습 & 가중치 내보내기

TT-NN은 추론 전용(autograd 없음)입니다. 그래서 바로 다음 MLP·CNN 추론 예제가 불러오는 .pt 가중치 파일은 이 PyTorch 스크립트로 먼저 CPU에서 학습해 만들어 둡니다.

전체 흐름은 명확합니다 — 여기(PyTorch)에서 학습 → 저장, 다음 예제(TT-NN)에서 그 가중치를 로드 → Tenstorrent에서 추론. 먼저 MNIST용 3-레이어 MLP를 학습하고 W1..b3 텐서를 저장합니다.

CNN(CIFAR-10)도 동일한 패턴입니다. 표준 PyTorch로 학습한 뒤 state_dict 전체를 저장하면, CNN 추론 예제(08)가 이를 각각 TT-NN 텐서로 변환해 사용합니다.

◈ 왜 학습은 PyTorch에서?

TT-NN은 추론에 최적화된 프레임워크라 역전파(autograd)를 제공하지 않습니다. 따라서 "학습은 익숙한 PyTorch에서, 추론은 Tenstorrent에서"라는 분업이 자연스럽습니다. 디바이스 학습이 필요하면 별도 프레임워크 tt-train을 사용하세요. 가중치가 없으면 두 추론 예제는 랜덤 가중치로 폴백하므로(정확도는 낮음), 이 스크립트를 먼저 실행하는 것을 권장합니다.

08 TT-NN · Python

MLP 추론 — MNIST 손글씨 분류

3-레이어 MLP를 ttnn.linear + ttnn.relu로 구성해 실제 MNIST 이미지를 분류합니다. 첫 번째 end-to-end 모델입니다.

각 레이어는 가중치 전치 → 편향 reshape → ttnn.linear → ReLU 패턴을 따릅니다. 마지막 레이어만 ReLU 없이 로짓을 출력하고, ttnn.to_torch로 내려 argmax로 예측 클래스를 얻습니다.

09 TT-NN · Python

CNN 추론 — CIFAR-10 이미지 분류

합성곱 + 활성화 + 맥스풀링을 하나의 스테이지로 묶고, 두 스테이지를 쌓은 뒤 완전연결 층으로 분류하는 실전 CNN입니다.

핵심은 conv → ReLU → max_pool을 캡슐화한 conv_pool_stage 함수입니다. Conv2dConfig(activation=...)로 활성화를 합성곱에 융합하고, ttnn.max_pool2d로 다운샘플링합니다. 완전연결 단계에서는 다시 TILE_LAYOUTttnn.linear를 사용합니다.

10 TT-NN · Python

멀티헤드 어텐션 — Transformer의 심장

BERT 스타일 멀티헤드 어텐션을 두 가지 방식으로 구현합니다. 먼저 기본 연산 조합, 그다음 ttnn.transformer 융합 연산으로 최적화합니다.

첫 번째 버전은 @(matmul), permute, softmax 같은 기본 연산을 조합해 어텐션을 직접 구성합니다. Q·K·V를 각각 투영하고, 스코어를 √d로 스케일링한 뒤 마스크를 더하고 softmax를 취합니다.

두 번째 버전은 TT-NN이 제공하는 융합 트랜스포머 연산을 사용합니다. QKV를 하나의 linear로 계산하고, split_query_key_value_and_split_heads·attention_softmax_·concatenate_heads로 여러 단계를 한 번에 처리합니다. ttnn.deallocate로 중간 텐서를 적극 해제하고, bfloat8_b로 matmul을 가속하는 점도 실전 최적화 포인트입니다.

◈ Program Cache 효과

튜토리얼은 두 구현을 각각 두 번 실행하며 시간을 측정합니다. 첫 반복은 커널 컴파일 때문에 느리지만, 두 번째 반복은 program cache 덕분에 훨씬 빠릅니다. 마지막에는 두 구현의 결과를 피어슨 상관계수(PCC ≥ 0.95)로 비교해, 최적화 버전(bfloat8_b)과 기본 버전(bfloat16)의 정밀도 차이를 허용 범위 안에서 검증합니다.

11 TT-NN · Python

CLIP 제로샷 분류 — 실제 규모의 모델

지금까지의 예제를 종합하는 실전편입니다. OpenAI의 CLIP ViT-B/32 전체(비전 Transformer + 텍스트 Transformer)를 TT-NN 기본 연산만으로 구성해, 라벨 학습 없이 이미지를 텍스트 후보로 분류합니다.

CLIP은 이미지와 텍스트를 같은 임베딩 공간으로 인코딩한 뒤 코사인 유사도로 매칭합니다. 먼저 사전학습된 PyTorch 가중치를 TT-NN 텐서로 변환하고, 텍스트 인코더용 인과(causal) 마스크를 만듭니다.

모델의 반복 단위는 Residual Attention Block입니다. 앞서 배운 어텐션과 ttnn.layer_norm·ttnn.gelu를 잔차 연결로 엮습니다. 이 블록을 12개 쌓으면 하나의 Transformer 인코더가 됩니다.

비전 쪽은 이미지를 ttnn.conv2d패치 임베딩(32×32 패치 → 토큰)한 뒤 [CLS] 토큰과 위치 임베딩을 붙여 Transformer에 넣습니다. 마지막으로 이미지·텍스트 임베딩을 L2 정규화하고 스케일된 내적으로 유사도를 계산합니다.

◈ 이 예제가 종합하는 것

linear·matmul·softmax·layer_norm·gelu·conv2d·embedding·permute·concat 등 앞서 배운 연산들이 하나의 실제 모델로 합쳐집니다. PyTorch의 CLIP과 달리 TT-NN은 아직 고급 인덱싱을 완전히 지원하지 않아, EOT 토큰 선택 같은 일부 단계는 잠시 호스트(torch)로 내려 처리하는 하이브리드 패턴을 씁니다.

12 TT-NN · 도구

모델 트레이싱 — 연산 그래프 시각화

ttnn.tracer는 실행되는 연산들을 포착해 계산 그래프로 그려줍니다. torch 연산과 TT-NN 연산이 어떻게 흐르는지, 모델 구조를 눈으로 확인할 때 유용합니다.

사용법은 간단합니다. with trace(): 블록 안의 연산을 기록하고 visualize(결과)로 그래프를 렌더링합니다. 순수 torch 연산도, torch ↔ TT-NN 변환 흐름도 모두 추적됩니다.

동일한 방식으로 실제 모델 전체도 추적할 수 있습니다. 아래는 BERT 질의응답 추론을 통째로 trace()로 감싸 그래프화하는 예입니다.

◈ Visualizer와의 관계

트레이서가 연산의 논리적 그래프(무엇이 무엇으로 흐르는가)를 보여준다면, 다음 절의 TT-NN Visualizer는 여기에 메모리·성능 측정치를 더해 하드웨어 관점의 분석을 제공합니다. 트레이싱을 켜려면 enable_fast_runtime_mode를 꺼야 한다는 점이 공통입니다.

13 TT-NN · 도구

TT-NN Visualizer — 모델 프로파일링

모델이 하드웨어 자원을 어떻게 쓰는지 시각적으로 분석하는 도구입니다. 메모리 리포트와 성능 리포트를 생성해 업로드하면 연산·텐서·버퍼·그래프·성능 탭에서 병목을 찾습니다.
  • Operations — 모델의 모든 연산을 검색·필터하고 연산별 입출력 텐서와 메모리 배치를 확인
  • Tensors — 각 텐서의 shape·dtype·레이아웃·샤딩·배치(L1/DRAM)와 연산 간 이동을 추적
  • Buffers — 실행 중 사용된 모든 메모리 버퍼의 할당 위치·수명·재사용을 시각화
  • Graph — 연산을 노드로, 텐서 흐름을 엣지로 표현한 모델 구조도
  • Performance — 연산별 실행 시간·사용 코어 수·FLOPs·활용도, Matmul 최적화 힌트

워크플로는 두 단계입니다. 먼저 메모리 리포트pytest + 설정 파일로 생성하고, 성능 리포트tracy 프로파일러로 생성합니다.

◈ 더 보기

두 리포트 디렉터리를 Visualizer에 업로드하면 모든 분석 탭이 활성화됩니다. 자세한 내용은 ttnn-visualizer 저장소를 참고하세요.

14 TT-Metalium · C++

DRAM 루프백 — 가장 단순한 커널

데이터 무브먼트 코어가 DRAM의 데이터를 L1로 읽어들였다가 다시 DRAM으로 내보냅니다. 그래서 "루프백"입니다. Metalium API의 기본 골격을 익힙니다.

연산은 없지만, Metalium 프로그램의 모든 뼈대가 여기 있습니다: 메시 디바이스 생성, 커맨드 큐, 프로그램, 버퍼(L1·DRAM), 커널 생성, 런타임 인자, 워크로드 실행. 먼저 디바이스와 프로그램을 준비합니다.

버퍼는 3개입니다: 임시 저장용 L1 버퍼(1타일), 입력 DRAM 버퍼(50타일), 출력 DRAM 버퍼(50타일). bfloat16 한 타일은 32×32×2 = 2048바이트입니다. page_size를 타일 크기로 두면 데이터가 여러 뱅크에 라운드로빈으로 분산되어 높은 대역폭을 얻습니다.

이제 {0, 0} 코어에 데이터 무브먼트 커널을 생성합니다. TensorAccessorArgs는 뱅크 주소 계산과 페이지 크기를 자동으로 처리해 줍니다.

커널 본체는 타일을 하나씩 DRAM → L1 → DRAM으로 복사합니다. 주소가 포인터가 아니라 uint32_t인 이유는, DRAM이 커널에서 직접 주소 접근되지 않고 NoC를 통해 요청되기 때문입니다. 비동기 읽기/쓰기 뒤의 배리어가 데이터 정합성을 보장합니다.

마지막으로 런타임 인자를 설정하고 워크로드를 실행한 뒤, 결과를 내려받아 검증합니다.

15 TT-Metalium · C++

이항 연산 — FPU와 서큘러 버퍼

두 텐서를 FPU(행렬 엔진)로 원소별 덧셈합니다. 이 예제에서 서큘러 버퍼리더/컴퓨트/라이터 3-커널 파이프라인이 처음 등장합니다.

루프백은 커널 하나였지만, 실제 연산은 역할을 나눕니다. 리더가 DRAM에서 타일을 읽어 서큘러 버퍼에 밀어넣고, 컴퓨트가 꺼내 더한 뒤 결과를 다시 밀어넣고, 라이터가 DRAM으로 씁니다. 세 커널은 서큘러 버퍼(파이프)로 통신합니다.

RISCV_0
리더
DRAM → CB
Compute
컴퓨트
CB → FPU → CB
RISCV_1
라이터
CB → DRAM

서큘러 버퍼는 인덱스, 총 크기, 데이터 포맷, 페이지 크기로 정의합니다. 여기서는 2타일짜리 버퍼 3개(입력 2 + 출력 1)를 만들어 더블 버퍼링합니다. 입력은 c_0, c_1, 출력은 관례적으로 c_16을 씁니다.

세 커널을 생성합니다. 리더와 라이터는 DataMovementConfig(각각 RISCV_0/RISCV_1)로, 컴퓨트는 ComputeConfig로 만듭니다. ComputeConfigmath_fidelity가 FPU 연산 정밀도를 결정합니다.

컴퓨트 커널이 핵심입니다. FPU를 덧셈용으로 초기화하고, 루프마다 (1) 입력 타일을 기다리고, (2) 목적지 레지스터를 확보하고, (3) add_tiles로 더하고, (4) 결과를 출력 CB로 pack하고, (5) 입력 타일을 소비 처리합니다. 이 acquire → compute → commit → pack → release 패턴은 모든 컴퓨트 커널의 표준 형태입니다.

◈ 3개의 컴퓨트 코어

컴퓨트 커널은 사실 Unpack·Math·Pack 세 RISC-V 코어용으로 각각 컴파일되어 3개의 바이너리가 됩니다. 세 코어가 협력하여 데이터를 엔진에 넣고(Unpack), 계산하고(Math), 결과를 빼냅니다(Pack). 덕분에 데이터 이동과 연산이 동시에 진행되어 높은 처리량을 냅니다.

16 TT-Metalium · C++

단항 연산 — SFPU 벡터 엔진

이번엔 FPU 대신 SFPU(벡터 엔진)exp(x)를 계산합니다. SFPU는 exp·sqrt·sin·cos·ReLU 같은 복잡한 원소별 함수를 담당합니다.

구조는 이항 덧셈과 거의 같지만, 입력 버퍼가 하나이고 컴퓨트 커널이 FPU 대신 SFPU API를 호출합니다. SFPU 흐름은 init_sfpu → 연산별 init(예: exp_tile_init) → copy_tile → 연산(exp_tile) → pack 입니다.

리더/라이터 커널은 입력이 하나라는 점만 빼면 이항 예제와 동일합니다. 컴퓨트 커널을 만들 때 ComputeConfig{.math_approx_mode = false}로 근사 모드를 끄면 더 정확한 결과를 얻습니다. 검증은 호스트에서 std::exp와 비교합니다.

◈ FPU vs SFPU 정리

FPU는 행렬 곱·덧셈·리덕션처럼 규칙적이고 무거운 연산에, SFPU는 초월함수·활성화처럼 원소마다 복잡한 계산이 필요한 연산에 씁니다. 함수 이름에 _tile이 붙고 init_sfpu로 시작하면 SFPU 경로입니다.

17 TT-Metalium · C++

행렬 곱 — 싱글 코어

데이터 무브먼트와 컴퓨트가 본격적으로 협력하는 첫 예제입니다. 하나의 Tensix 코어에서 FPU로 타일 단위 행렬 곱을 수행합니다.

행렬 차원 M·K·N을 타일 차원 Mt·Kt·Nt로 환산합니다(하드웨어는 32×32 타일 단위). 호스트에서는 입력을 tilize_nfaces로 타일 레이아웃으로 바꾸고, CPU에서 골든 레퍼런스를 계산해 나중에 정확도를 검증합니다.

컴퓨트 커널이 핵심입니다. 출력 타일 하나를 계산할 때, K 방향으로 누산하는 안쪽 루프가 있습니다: tile_regs_acquire로 누산 레지스터를 0으로 초기화한 뒤, matmul_tilesKt번 호출해 부분곱을 더해 나갑니다. Mt·Kt·Nt는 컴파일 타임 인자로 넘겨 최적화합니다.

리더 커널은 타일을 읽는 순서가 중요합니다. 컴퓨트가 요구하는 순서(mt → nt → kt)에 맞춰, A는 mt*Kt + kt, B는 kt*Nt + nt 인덱스로 타일을 읽어 각 서큘러 버퍼에 밀어넣습니다.

실행 후 결과는 타일 레이아웃이므로 untilize_nfaces로 행 우선으로 되돌리고, 골든 레퍼런스와 피어슨 상관계수(PCC > 0.97)로 비교해 정확도를 검증합니다.

◈ 이 예제가 보여주는 핵심 패턴

데이터 이동과 연산의 분리(전용 RISC-V가 복잡한 접근 패턴을 처리하는 동안 FPU는 계속 계산), 타일 단위 연산(하드웨어 자연 단위), 더블 버퍼링 파이프라인(다음 타일을 미리 가져와 유휴 시간 최소화).

18 TT-Metalium · C++

행렬 곱 — 멀티 코어(SPMD)

싱글 코어 예제를 확장해, 가능한 많은 Tensix 코어에 일을 나눕니다. 출력 타일을 코어들에 분배하는 SPMD 전략을 씁니다.

API 자체는 거의 그대로입니다. 달라지는 건 일을 나누는 방식입니다. Metalium의 split_work_to_cores가 전체 출력 타일 수를 코어 수로 최대한 고르게 분배해 줍니다. 나누어떨어지지 않는 경우까지 알아서 처리합니다.

서큘러 버퍼와 커널은 단일 코어가 아니라 all_cores에 생성합니다. 그리고 각 코어마다 "몇 개의 타일을, 어디서부터" 처리할지 런타임 인자로 직접 지정합니다. Metalium은 CUDA/OpenCL과 달리 동적 스케줄링이 없으므로, 이 분배는 프로그래머의 몫입니다.

컴퓨트 커널은 IO를 신경 쓰지 않으므로, 싱글 코어 버전과 거의 같고 "할당받은 타일 수"만큼만 바깥 루프를 돕니다. 리더는 자신의 시작 타일 ID로부터 담당 출력 타일의 행·열을 계산해 필요한 A·B 타일을 읽습니다.

◈ 주의 — 정적 병렬화

CUDA/OpenCL은 코어보다 많은 작업 그룹을 던지면 하드웨어 스케줄러가 동적으로 배분·로드밸런싱합니다. 하지만 Metalium은 정적입니다. 코어 수보다 많은 작업을 동시에 던질 수 없고, 각 코어는 시작 시 할당된 몫만 처리한 뒤 유휴 상태가 됩니다. 그래서 작업을 고르게 나누는 것이 성능의 핵심입니다. 또한 커널을 생성한 코어에는 반드시 런타임 인자를 설정해야 하며, 그렇지 않으면 프로그램이 멈추거나 죽을 수 있습니다.

◈ 다음 단계

여기서 쓴 SPMD는 범용적이지만 최적은 아닙니다. Tenstorrent 아키텍처의 진짜 성능은 데이터 재사용(data reuse)멀티캐스트(multicast)를 활용한 시스톨릭 배열 패턴에서 나옵니다 — 한 번 읽은 A·B 타일을 여러 코어가 NoC로 공유하여 DRAM 접근을 줄이는 방식입니다. 이는 matmul_multi_core_optimized 예제에서 다룹니다.

19 TT-Metalium · 심화

행렬 곱 최적화 — 데이터 재사용 & 멀티캐스트

멀티 코어 SPMD는 범용적이지만 매번 DRAM에서 타일을 다시 읽습니다. 여기서는 데이터 재사용코어 간 멀티캐스트로 Tenstorrent 아키텍처의 진짜 성능을 끌어냅니다.

① 데이터 재사용 — 서브블록과 중간 CB

블록을 더 잘게 나눈 서브블록(subblock) 단위로 연산하고, 부분합(partial result)을 중간 서큘러 버퍼(c_24)에 쌓아 재사용합니다. 최적 블록/서브블록 크기는 get_large_matmul_params가 계산해 줍니다.

재사용의 핵심은 컴퓨트 커널에서 이전 블록의 부분합을 되불러와(reload) 이어서 누산하는 것입니다. 마지막 블록에서야 최종 출력이 완성됩니다.

② 멀티캐스트 — 코어 간 데이터 브로드캐스트

더 나아가, 타일을 코어마다 따로 읽는 대신 한 번 읽어 여러 코어에 NoC로 뿌립니다. 코어 그리드를 역할별로 나눠, 왼쪽 열은 in0 행을 아래로, 위쪽 행은 in1 열을 옆으로 멀티캐스트하고, 나머지 코어는 받아서 계산합니다("torrent"라는 이름 그대로 데이터가 흐릅니다).

MASTERsend
in1send↑
in1send↑
in1send↑
in0send→
compute
compute
compute
in0send→
compute
compute
compute
in0send→
compute
compute
compute
마스터 송신 (0,0) in0 행 송신 (왼쪽 열) in1 열 송신 (위쪽 행) 수신 + 부분합 계산

코어들은 CoreRange로 역할 그룹을 나누고, 이른 송수신을 막기 위해 세마포어로 동기화합니다.

◈ 참고

멀티캐스트 예제는 4개의 서로 다른 데이터플로 커널(in0 송신/수신, in1 송신+라이터/수신+라이터)을 역할 그룹별로 배치하고, 컴퓨트 커널에는 바이어스 덧셈 + 활성화 함수를 융합(bmm_large_block_zm_fused_bias_activation)합니다. 이 특정 mcast 예제는 Grayskull 전용이라는 점에 유의하세요. 실제 프로덕션에서는 이러한 최적화를 TT-NN의 ttnn.matmul이 내부적으로 자동 적용합니다.

20 TT-Metalium · 심화

커스텀 SFPU 연산 — SFPI로 직접 작성

표준 라이브러리에 없는 나만의 원소별 연산이 필요하다면? SFPI(SFPU Interface)는 C++로 SFPU 벡터 엔진을 직접 프로그래밍하는 라이브러리입니다. 32-wide 벡터, FP32/INT32, 완전한 조건부 실행을 지원합니다.

먼저 가장 단순한 예 — 벡터 덧셈입니다. 컴퓨트 커널의 흐름은 기존 SFPU 예제와 같지만, 표준 함수 대신 커스텀 함수 my_add_tile를 호출합니다.

커스텀 연산은 계층적으로 구현합니다. 저수준 my_add_tile_face는 타일의 한 face(16×16)에 대해 vFloat SIMD 벡터로 실제 계산을 하고, 고수준 my_add_tileMATH() 매크로로 감싸 math 스레드에서만 4개 face를 순회 실행합니다.

한 단계 더 나아가 smoothstep을 구현하면 두 가지 고급 기능을 볼 수 있습니다: 커널에 스칼라 파라미터 전달과, 레인별 조건 분기인 벡터 프레디케이트(v_if/v_elseif/v_endif).

◈ 계층 구조의 이점

vConst0·vConst1은 하드웨어가 미리 준비한 0.0/1.0 벡터 상수로, 리터럴을 벡터로 브로드캐스트하는 오버헤드를 없애 줍니다. 입력 개수에 따라 SFPU_UNARY_/BINARY_/TERNARY_CALL_NO_TEMPLATE_ARGS 매크로를 골라 씁니다. 이 계층 패턴 덕분에 고수준 로직과 하드웨어 세부사항이 분리됩니다.

◈ 안정성 경고

SFPI 매크로·LLK 헬퍼는 내부 API이며 Tenstorrent는 하위 호환을 보장하지 않습니다. 또한 벡터 폭(위 예제의 32)은 아키텍처 의존적입니다(현재 Wormhole·Blackhole 기준). 커스텀 SFPI 코드는 항상 최신 Metalium 릴리스에 맞춰 유지하세요.

21 TT-XLA · 프론트엔드

TT-XLA 개요 & 설치

이미 JAX/PyTorch-XLA로 짜인 모델을 코드 변경 없이 Tenstorrent에서 실행하기

TT-XLA는 XLA/StableHLO를 통해 컴파일되는 프레임워크(JAXPyTorch/XLA)가 Tenstorrent 하드웨어에서 실행되도록 해주는 PJRT 플러그인입니다. TT-NN이나 TT-Metalium처럼 전용 API로 새로 작성하는 대신, 기존 XLA 코드를 최소한의 변경으로 가속기에 올리고 싶을 때 쓰는 진입점입니다.

이 그룹은 개요·설치부터 JAX/PyTorch 예제, 혼합 정밀도, 코드 생성, 모델 실행까지를 개별 섹션으로 다룹니다.

// PJRT

PJRT 백엔드 통합

pjrt-plugin-tt로 JAX·PyTorch/XLA를 Tenstorrent에 연결합니다. StableHLO 그래프를 입력으로 받습니다.

// STACK

tt-mlir 위에서 동작

프레임워크 → StableHLO → PJRT → tt-mlir → tt-metal → 디바이스. 단일·멀티 칩 모두 지원합니다.

// FRAMEWORKS

JAX & PyTorch

JAX는 jit(backend="tt"), PyTorch는 model.compile(backend="tt")+xla_device(). 구형 TT-Torch를 대체합니다.

// PRECISION

혼합 정밀도 · codegen

레이어별 가중치 dtype 오버라이드와, 컴파일 결과를 파이썬 코드로 내보내는 codegen을 지원합니다.

TT-XLA는 공식 표현으로 "a PJRT-based backend integration that enables JAX and PyTorch/XLA to run on Tenstorrent AI hardware"입니다. JAX/PyTorch가 모델을 StableHLO 그래프로 낮추면, TT-XLA의 PJRT 플러그인이 이를 tt-mlir 컴파일러로 넘기고, tt-metal 런타임을 거쳐 Wormhole·Blackhole에서 실행됩니다. 멀티 칩도 지원하며 과거 PyTorch용이던 TT-Torch를 대체합니다.

설치 — 휠 (권장)

모델을 실행만 하려면 미리 빌드된 휠을 설치합니다. 추가 인덱스에서 pjrt-plugin-tt를 설치한 뒤 tt-forge-install로 시스템 의존성을 채웁니다.

설치 — Docker & 소스

컨테이너로 실행하려면 슬림 이미지를, 소스 빌드 시에는 몇 가지 시스템 의존성을 설치합니다.

22 TT-XLA · 프론트엔드

JAX 예제 — 선형 회귀

JAX 코드는 거의 그대로 둡니다. 핵심은 jit(..., backend="tt")로 컴파일 백엔드만 Tenstorrent로 지정하는 것입니다. 표준 vmap·grad·jit를 그대로 씁니다.

23 TT-XLA · 프론트엔드

PyTorch 예제 — MNIST

PyTorch는 PyTorch/XLA를 통해 지원됩니다. 모델을 model.compile(backend="tt")로 컴파일하고 xm.xla_device()가 반환하는 디바이스로 옮기면 됩니다.

컴파일러 옵션 & eager 모드

컴파일 외에 세부 제어와 즉시 실행(eager)도 가능합니다. examples/pytorch/compiler_options.py(옵션), test_eager_mode.py(eager), export_ir_example.py(IR 내보내기)를 참고하세요.

24 TT-XLA · 프론트엔드

혼합 정밀도 — 레이어별 dtype 오버라이드

전체를 균일하게 양자화하면 민감한 레이어에서 정확도가 떨어질 수 있습니다. TT-XLA는 텐서(가중치)별로 dtype을 지정할 수 있어, 대부분을 bfp_bf8/bfp_bf4로 낮추고 일부만 bf16으로 유지할 수 있습니다(현재 matmul·linear 가중치만 지원).

25 TT-XLA · 프론트엔드

코드 생성 (codegen)

컴파일 결과를 독립 실행 가능한 파이썬 코드로 내보낼 수 있습니다. compiler_optionsbackendexport_path를 지정하면 디버깅·이식에 활용할 수 있습니다.

26 TT-XLA · 프론트엔드

모델 실행 & 멀티칩 예제

저장소의 예제를 내려받아 곧바로 실행할 수 있습니다.

예제 저장소에는 실제 규모의 모델이 다수 포함됩니다: ResNet, Llama, Qwen3, Mistral, GPT-OSS-20B, OLMo3, Stable Diffusion(v1.4~XL). 또한 멀티칩(n300)의 데이터·텐서 병렬 추론과 CCL 연산, 직렬화 예제도 있습니다.

◈ 더 알아보기

성능 개선, 모델 자동 탐색 테스트, op 퓨전/합성, PyTorch/XLA 소스 빌드, Explorer 시각화 도구 등은 공식 문서의 해당 페이지에서 다룹니다.

27 TT-Lang · 커널 언어

TT-Lang 개요 & 프로그래밍 모델

TT-NN과 TT-Metalium 사이의 표현력 있는 중간 지대 — 파이썬 임베디드 커널 DSL

TT-Lang은 Tenstorrent 하드웨어용 고성능 커스텀 커널을 작성하기 위한 파이썬 임베디드 DSL입니다. 고수준 TT-NN 연산과 저수준 TT-Metalium 사이의 간극을 메워, 퓨전 커널을 표현하면서도 파이프라이닝·동기화를 원할 때만 세밀하게 제어할 수 있게 해줍니다(점진적 공개).

이 그룹은 프로그래밍 모델·설치부터 Elementwise·Matmul 튜토리얼, 완전한 커널 예제, 디버깅까지를 개별 섹션으로 다룹니다.

// DSL

파이썬 임베디드 DSL

@ttl.operation 안에 @ttl.compute·@ttl.datamovement 커널을 모아 정의합니다. ttnn.Tensor를 그대로 인자로 받습니다.

// MIDDLE

TT-NN ↔ TT-Metalium

TT-NN은 퓨전이 어렵고 TT-Metalium은 저수준 부담이 큽니다. TT-Lang은 그 중간에서 컴파일러 보조 자원 관리를 제공합니다.

// DATAFLOW

데이터플로 버퍼(DFB)

reserve()/push()로 생산, wait()/pop()으로 소비하는 L1 통신 파이프. 커널 사이 데이터를 동기화합니다.

// SCALE

노드 → 멀티디바이스

grid/node로 코어 그리드에 분배하고, ShardTensorToMesh·all_reduce로 여러 디바이스까지 확장합니다.

연산 함수@ttl.operation()로 감싼 파이썬 함수로, 그 안에 정의된 커널 함수들이 자동 수집·컴파일됩니다. 커널 함수는 @ttl.compute()(수학) 또는 @ttl.datamovement()(메모리 전송)로 표시합니다.

연산은 노드들로 이루어진 그리드 위에서 실행됩니다. ttl.grid_size(dims)는 그리드 크기를, ttl.node(dims)는 현재 노드 좌표를 돌려줍니다. 커널 사이 통신은 데이터플로 버퍼(DFB)로 하며, 생산자는 reserve()·push(), 소비자는 wait()·pop()을 씁니다. DFB에서 꺼낸 메모리 단위가 블록입니다.

28 TT-Lang · 커널 언어

설치 & 함수형 시뮬레이터

하드웨어가 있으면 PyPI로 설치합니다(Python 3.12 권장). 하드웨어 없이 로직만 검증하려면 시뮬레이터 전용 패키지를 씁니다.

함수형 시뮬레이터 & 검증

설치 후 예제를 시뮬레이터로 바로 실행해 동작을 확인합니다. 커널을 순수 파이썬으로 실행하므로 하드웨어 없이 로직을 검증할 수 있습니다.

29 TT-Lang · 커널 언어

튜토리얼 ① Elementwise (step 0 → 4)

공식 Elementwise 튜토리얼은 a*b + c*d 같은 원소별 연산을 5단계로 발전시킵니다. step 0은 TT-NN 기준선으로, 연산마다 따로 디스패치되어 중간 결과가 DRAM을 왕복합니다(메모리 병목).

step 1은 TT-Lang의 전체 모델을 도입합니다: @ttl.operation(grid=(1,1)) 아래 compute·reader·writer 세 커널이 동시에 돌고, L1의 DFB로 통신하며 하나의 퓨전 커널로 계산합니다.

step 2는 타일을 GRANULARITY×GRANULARITY 패치로 묶어 동기화 오버헤드를 줄이고, step 3grid=(4,4)로 여러 노드에 병렬화하며, step 4grid="full"로 그리드를 컴파일러가 정하게 하고 올림 나눗셈·경계 검사로 나눠떨어지지 않는 분배까지 처리합니다.

30 TT-Lang · 커널 언어

완전한 예제 — eltwise_add 커널

두 텐서를 타일 단위로 더하는 완전한 커널입니다(step 4 형태). @ttl.operation이 그리드 분배를, @ttl.compute가 덧셈을, 두 @ttl.datamovement가 입력 읽기·출력 쓰기를 담당합니다.

31 TT-Lang · 커널 언어

튜토리얼 ② Matmul (step 0 → 7)

Matmul 튜토리얼은 단일 노드에서 멀티디바이스까지 확장합니다. step 0은 TT-NN 기준선(relu(A@B + C)), step 1은 K 방향으로 누산하는 단일 타일 커널입니다.

step 2는 블록으로 묶어 활용도를 높이고, step 3~4는 M×N 출력을 코어 그리드에 분배합니다. 이후는 멀티디바이스입니다: step 5는 M 차원을 ShardTensorToMesh(dim=0)로 샤딩(K×N 복제, 통신 불필요), step 6은 K 차원 샤딩 후 호스트 합산, step 7ttnn.all_reduce로 TT-Fabric 위 온-디바이스 리덕션을 수행합니다.

32 TT-Lang · 커널 언어

에러 & 디버깅

examples/errors/에는 흔한 실수의 재현 예가 있습니다: 데드락(eltwise_add_deadlock.py), copy 잠금 오류(copy_lock_error.py), DFB 과다 경고(max_dfbs_warning.py). 동기화 순서가 어긋나면 데드락이 나므로 reserve/wait 짝을 맞추는 것이 중요합니다. 진단은 print-debugging·compiler-options·performance-tools 문서를 참고하세요.

◈ 언제 TT-Lang을 쓰나

여러 TT-NN 연산을 하나로 퓨전해 중간 텐서의 DRAM 왕복을 없애고 싶은데 TT-Metalium으로 밑바닥부터 짜기엔 부담이 클 때가 TT-Lang의 자리입니다. 간단한 커널은 최소한만 적고, 성능이 필요할 때만 파이프라이닝·동기화를 세밀하게 제어합니다.

33 배포 · 모델 선택

모델 선택 가이드 — VRAM 계산기

이 모델이 내 하드웨어에 올라갈까? — 가중치·KV 캐시·정밀도로 메모리 가늠하기

모델을 서빙하기 전에 반드시 확인할 것은 "이 모델이 내 장치 메모리에 올라가는가"입니다. 파라미터가 많거나 컨텍스트가 길수록 요구 메모리가 커지고, 정밀도(양자화)를 낮추면 줄어듭니다. VRAM 계산기 (cv-learn.com)는 모델·정밀도·컨텍스트를 입력하면 필요한 메모리를 추정해 줍니다.

이 배포 그룹은 먼저 모델 선택(VRAM)을 다루고, 이어서 vLLM 추론 서버 배포로 넘어갑니다.

// WEIGHTS

가중치 메모리

파라미터 수 × 정밀도 바이트. 고정 비용이며 정밀도로 2~8배까지 줄일 수 있습니다.

// KV CACHE

KV 캐시

컨텍스트 길이·배치에 선형 비례. 긴 컨텍스트에서는 가중치보다 큰 병목이 되기도 합니다.

// PRECISION

정밀도 · 양자화

BF16 → bfloat8_b → bfloat4_b로 낮출수록 절감됩니다. Tenstorrent가 기본 지원합니다.

// FIT

적합성 판단

가중치 + KV 캐시 + 오버헤드 합이 장치 메모리에 들어오는지로 모델을 고릅니다.

VRAM 계산기는 모델(또는 파라미터 수), 양자화/정밀도, 컨텍스트 길이(그리고 배치)를 입력받아 필요한 메모리를 가중치 + KV 캐시 + 오버헤드로 나누어 추정합니다. 다음 세 섹션에서 각 요소의 원리를 봅니다.

cv-learn VRAM 계산기 화면 — 모델·하드웨어·양자화·컨텍스트 입력과 메모리 결과(FITS 여부)
cv-learn VRAM 계산기 — 모델·하드웨어(Blackhole p150a 등)·양자화·컨텍스트를 입력하면 가중치 · KV 캐시 · 활성화 · 오버헤드로 나눠 필요 메모리와 FITS 여부를 보여줍니다. Tenstorrent(tt-vllm / tt-metal) 서빙 프레임워크도 고를 수 있습니다.
34 배포 · 모델 선택

① 가중치 메모리 — 파라미터 × 정밀도

가중치가 차지하는 메모리는 파라미터 수 × 파라미터당 바이트로 결정되며, 컨텍스트와 무관한 고정 비용입니다. 정밀도를 낮추면(양자화) 선형으로 줄어듭니다.

35 배포 · 모델 선택

② KV 캐시 — 컨텍스트가 길수록 폭증

생성 추론에서는 이전 토큰들의 key/value를 캐시합니다. 이 KV 캐시컨텍스트 길이·배치에 선형 비례하므로 2K에서 넉넉하던 모델이 32K에서는 메모리를 초과할 수 있습니다.

36 배포 · 모델 선택

③ 정밀도로 메모리 줄이기 (양자화)

정밀도를 낮추는 것은 메모리를 줄이는 가장 효과적인 수단으로, 품질 저하를 최소화하며 2~4배까지 절감합니다. Tenstorrent는 bfloat16bfloat8_bbfloat4_b를 기본 지원합니다(트레이드오프는 00절 데이터 타입 표 참고).

◈ VRAM 계산기 사용법

cv-learn VRAM 계산기에 모델·정밀도·컨텍스트를 입력하면 가중치·KV 캐시·오버헤드 합계를 보여줍니다. 이 값을 장치 메모리와 비교해 그대로 올릴지·정밀도를 낮출지·컨텍스트를 줄일지·더 작은 모델로 갈지 결정하세요.

37 배포 · 모델 선택

실전 예 & Tenstorrent 하드웨어 매핑

실전 예 — 8B vs 70B

두 모델을 정밀도별로 대략 계산하면 어느 하드웨어에 맞는지 감이 옵니다(가중치만).

하드웨어 → 권장 모델

공식 tt-inference-server 문서의 하드웨어별 검증 조합입니다. 위 계산으로 용량을 가늠한 뒤 출발점으로 삼으세요.

◈ 다음 단계 — 서빙

모델을 골랐다면 이어지는 vLLM 서버 섹션에서 위 DEVICE·MODEL 값으로 서버를 띄웁니다.

38 배포 · vLLM 서버

vLLM 추론 서버 — 개요 & 메시 토폴로지

vLLM 기반 tt-inference-server로 OpenAI 호환 LLM 서버 띄우기
// ENTRYPOINT

tt-inference-server란

vLLM과 tt-metal을 Tenstorrent에서 연결하는 배포 도구. Docker·모델 다운로드·서빙 설정을 자동화합니다.

// RUN.PY

단일 명령 배포

run.py에 --workflow server --docker-server를 주면 Docker 셋업과 서버 기동이 자동입니다.

// AUTH

JWT 인증

JWT_SECRET으로 서명한 토큰(pyjwt)을 Bearer 헤더로 전달해 API를 호출합니다.

// OPENAI API

OpenAI 호환

포트 8000에서 /v1/completions 등 OpenAI 표준 API를 제공합니다.

공식 문서는 tt-inference-server를 "Tenstorrent 하드웨어에서 추론을 서빙할 모델을 배포·테스트하는 가장 빠른 방법"으로 소개합니다. vLLM과 tt-metal을 연결해 Docker·가중치 다운로드·서빙을 자동화하고 OpenAI 호환 엔드포인트를 노출합니다.

◈ 사전 요구사항

루트 파티션 최소 360GB 여유, 비루트 Docker, 가중치 다운로드용 인터넷이 필요합니다. Wormhole 계열(QuietBox/LoudBox)은 배포 전 메시 토폴로지를 먼저 구성합니다.

(Wormhole 전용) 메시 토폴로지

39 배포 · vLLM 서버

모델 접근 & 하드웨어 선택

Llama 같은 게이트된 모델은 Hugging Face에서 접근 요청을 승인받고 토큰을 발급해 export 합니다.

시스템에 맞춰 DEVICE·MODEL을 지정합니다(MODEL 값에는 meta-llama/ 접두어를 붙이지 않습니다).

◈ 어떤 모델을 고를지 모르겠다면

같은 배포 그룹의 VRAM 계산기 섹션에서 용량을 먼저 가늠하세요.

40 배포 · vLLM 서버

서버 실행 (run.py + Docker)

각 모델 구현은 미리 빌드된 릴리스 Docker 이미지에 매핑되므로 최신 버전 태그를 체크아웃합니다.

JWT_SECRET을 설정한 뒤 run.py로 서버를 기동합니다. 첫 실행은 가중치 다운로드에 30분 이상, 초기화에 70B는 약 40분·8B는 약 10분이 걸릴 수 있습니다.

41 배포 · vLLM 서버

상태 확인 & API 키 발급

서버가 준비되면 /health가 200을 반환합니다. API 키는 JWT_SECRET으로 서명한 JWT로, pyjwt로 만듭니다.

42 배포 · vLLM 서버

OpenAI 호환 API 호출

엔드포인트는 http://localhost:8000이며 /v1/completions 등 OpenAI 표준 경로를 제공합니다. 첫 요청은 워밍업으로 느립니다.

Python OpenAI 클라이언트

curl 대신 OpenAI 파이썬 클라이언트로 동일 엔드포인트를 호출할 수 있습니다. base_url만 바꾸면 됩니다.

43 배포 · vLLM 서버

확장 — 임베딩 모델 & 도구

LLM 외에 BGE-M3, Qwen3-Embedding, TinyLlama 같은 모델도 서빙할 수 있습니다. 저장소 examples/vllm/ 아래 각 모델 폴더의 service.sh(서버 기동)와 client.py(요청)를 참고하세요.

◈ 다음 단계

실시간 코어 활동·전력·메모리 트래픽은 tt-toplike로, 포인트-앤-클릭 배포·채팅 UI는 TT-Studio로 확인할 수 있습니다. 로컬 vLLM 엔드포인트는 Aider 같은 도구와도 연동됩니다.

44 부록 · 학습 자료

용어집 — Tenstorrent 핵심 용어

이 페이지에 반복 등장하는 용어를 한곳에 모았습니다. 아래 검색창에 한글·영문·키워드를 입력해 바로 찾으세요.
일치하는 용어가 없습니다.
NPU Neural Processing Unit
AI 연산 전용 가속기. Tenstorrent의 Grayskull·Wormhole·Blackhole 칩이 여기에 해당합니다.
Tensix 코어 Tensix core
칩의 기본 연산 단위. 5개의 RISC-V + FPU(행렬) + SFPU(벡터) + L1 SRAM으로 구성되며, 2D 그리드로 배열됩니다.
RISC-V baby cores
Tensix 내부의 프로그래머블 코어. 2개는 데이터 이동, 3개(Unpack·Math·Pack)는 컴퓨트를 담당합니다.
NoC Network-on-Chip
코어와 DRAM을 잇는 온칩 네트워크. 모든 데이터 이동이 이 경로로 이뤄집니다.
타일 Tile (32×32)
32×32 값 묶음. 하드웨어 연산의 기본 단위이며 bfloat16 기준 2048바이트입니다.
L1 (SRAM) on-core memory
코어 내부의 빠르고 작은 스크래치패드. 성능의 핵심은 데이터를 L1에 붙잡아 두어 DRAM 왕복을 줄이는 것입니다.
DRAM off-chip memory
칩 외부 대용량 메모리. L1보다 크지만 느립니다.
서큘러 버퍼 Circular Buffer
커널 사이를 잇는 FIFO 파이프. 리더가 push, 컴퓨트가 pop. Tensix당 최대 32개.
FPU Matrix Engine
행렬 곱·덧셈·리덕션 등 규칙적이고 무거운 연산을 담당하는 엔진.
SFPU Vector Engine
exp·sqrt·sin·ReLU 등 복잡한 원소별 함수를 담당하는 엔진.
bfloat16/8_b/4_b block float
신경망용 저정밀 포맷. 낮출수록 메모리·대역폭을 절감(2~8배)하며 정확도는 하락합니다.
TILE_LAYOUT / ROW_MAJOR layout
타일 기반 / 행 우선 텐서 저장 방식. 고성능 연산은 대부분 TILE_LAYOUT을 요구합니다.
Program Cache JIT cache
JIT 컴파일된 커널 캐시. 첫 실행은 느리고 두 번째 실행부터 빨라집니다.
Math Fidelity LoFi~HiFi4
FPU의 정밀도 모드. LoFi(빠름·부정확)~HiFi4(완전 FP32 누산·정확).
Mesh / MeshDevice device mesh
여러 디바이스(또는 1×1 단일)를 하나로 다루는 추상. 코드 변경 없이 확장 가능.
Command Queue FIFO
업/다운로드와 프로그램 실행을 순서대로 처리하는 비동기 FIFO 큐.
Kernel reader/compute/writer
코어에서 실행되는 코드. 데이터 이동 커널(리더·라이터)과 컴퓨트 커널로 나뉩니다.
tilize / untilize
행 우선 ↔ 타일 레이아웃 변환. 디바이스에 올릴 때 tilize, 읽어올 때 untilize.
Sharding 샤딩
텐서를 여러 코어/디바이스에 분산 배치해 데이터 이동을 줄이는 기법.
CCL collective comms
all_gather·all_reduce 등 멀티 디바이스 집합 통신 연산.
TT-Fabric
디바이스 간 고속 인터커넥트. 온-디바이스 리덕션 등에 활용됩니다.
Metal Trace
연산 시퀀스를 녹화·재생해 Python 호스트 오버헤드를 제거하는 기능.
PJRT
XLA 백엔드 플러그인 인터페이스. TT-XLA가 이를 구현해 JAX/PyTorch-XLA를 연결합니다.
StableHLO SHLO
XLA의 중간 표현(그래프). 프레임워크가 이 형태로 낮춘 뒤 tt-mlir로 넘어갑니다.
tt-mlir
TT-XLA·TT-Forge 아래에 있는 MLIR 기반 컴파일러 스택.
PCC Pearson corr.
피어슨 상관계수. 디바이스 결과와 기준값의 유사도로 정확도를 검증(예: > 0.97).
HugePages
대용량 페이지 메모리. tt-installer가 설치 시 구성합니다.
tt-smi / tt-topology / tt-flash / tt-kmd
관리·텔레메트리 / 메시 구성 / 펌웨어 / 커널 드라이버 도구.
Dataflow Buffer (DFB) TT-Lang
TT-Lang에서 커널 사이를 잇는 L1 통신 버퍼. reserve/push/wait/pop으로 다룹니다.
Core Grid 코어 그리드
연산에 사용할 Tensix 코어의 2D 집합. 작업을 이 그리드에 정적으로 분배합니다.
45 부록 · 학습 자료

치트시트 — 자주 쓰는 명령 & 연산

작업 중 바로 찾아 쓰는 빠른 참조: 설치·검증 명령, GPU↔TT 코드 대응, TT-NN 핵심 연산, dtype 선택.

설치 · 검증 · 리셋

GPU/PyTorch ↔ TT-NN 코드 대응

PyTorch (GPU)TT-NN설명
x.cuda()ttnn.from_torch(x, layout=ttnn.TILE_LAYOUT, device=dev)텐서를 디바이스로
x.cpu()ttnn.to_torch(x)호스트로 복귀
a @ bttnn.matmul(a, b) 또는 a @ b행렬 곱
F.linear(x, w, b)ttnn.linear(x, w, bias=b)선형 계층
F.relu(x)ttnn.relu(x)활성화
F.softmax(x, -1)ttnn.softmax(x, dim=-1)소프트맥스
nn.Conv2dttnn.conv2d(...) (NHWC)합성곱 — 입력은 NHWC
torch.float16ttnn.bfloat16 / bfloat8_b정밀도
device="cuda:0"ttnn.open_device(device_id=0)디바이스 열기

TT-NN 핵심 연산

연산용도비고
ttnn.from_torch / to_torchtorch ↔ TT-NN 변환dtype·layout·device 지정
ttnn.to_layoutTILE ↔ ROW_MAJOR고성능 연산은 TILE
ttnn.matmul / linear행렬 곱 / 선형core_grid·memory_config로 튜닝
ttnn.add / mul / sub원소별 연산브로드캐스트 지원
ttnn.deallocate중간 텐서 해제L1 절약에 필수
ttnn.transformer.*어텐션 융합 연산split_qkv, attention_softmax_ 등
ttnn.all_gather / all_reduce멀티 디바이스 통신메시에서 사용

dtype 선택 가이드

◈ 어떤 도구를 쓸까?

TT-NN — PyTorch식으로 빠르게 모델 실행(대부분 여기서 시작). TT-Metalium — C++로 커널을 밑바닥부터. TT-XLA — 기존 JAX/PyTorch-XLA 코드를 그대로. TT-Lang — 퓨전 커널을 파이썬 DSL로(둘의 중간). 자세한 결정은 아래 FAQ를 참고하세요.

46 부록 · 학습 자료

문제 해결 & FAQ

처음 겪기 쉬운 오류와 자주 묻는 질문을 모았습니다. 항목을 눌러 펼치세요.

자주 겪는 오류

"No Tenstorrent devices detected!" — 장치가 안 잡혀요
lspci -d 1e52로 PCIe 열거를 먼저 확인하세요. 비어 있으면 전원(팬·LED)·재장착을 점검합니다. 열거는 되는데 안 잡히면 tt-smi -r로 리셋하고, 드라이버가 로드됐는지(tt-smi) 확인합니다.
L1 메모리 부족 / Out of Memory
중간 텐서를 ttnn.deallocate()로 즉시 해제하고, 큰 텐서는 memory_config=ttnn.DRAM_MEMORY_CONFIG로 DRAM에 두세요. conv 등은 open_device(l1_small_size=8192)로 작업 공간을 확보합니다. L1은 코어당 1~1.5MB로 작습니다.
레이아웃 / 포맷 관련 에러
고성능 연산은 TILE_LAYOUT을 요구합니다. ttnn.to_layout(x, ttnn.TILE_LAYOUT)로 변환하세요. conv2d 입력은 NHWC여야 하므로 ttnn.permute로 축을 바꿉니다. 32의 배수가 아닌 크기는 타일로 자동 패딩됩니다.
첫 실행이 너무 느려요
TT-NN은 커널을 JIT 컴파일합니다. 첫 실행은 컴파일 때문에 느리고, 같은 shape·dtype·layout이면 program cache 덕분에 두 번째부터 빨라집니다. 벤치마크는 두 번째 반복 이후로 측정하세요.
정확도가 기대보다 낮아요
정밀도를 확인하세요 — bfloat8_b/bfloat4_b는 메모리를 아끼는 대신 정확도가 떨어집니다. 행렬 곱은 MathFidelity::HiFi4로 올리고, 검증은 allclose 대신 PCC(피어슨 상관계수)로 하는 것이 관례입니다(예: > 0.97).
vLLM 서버가 안 떠요 / 느려요
디스크 여유(최소 360GB), Docker 비루트 실행, 게이트 모델은 HF_TOKEN 승인을 확인하세요. Wormhole 시스템은 tt-topology -l mesh로 메시를 먼저 구성해야 합니다. 첫 기동은 가중치 다운로드+초기화로 수십 분 걸릴 수 있습니다.

자주 묻는 질문

TT-NN, TT-Metalium, TT-XLA, TT-Lang 중 무엇을 써야 하나요?
모델을 빠르게 실행하고 싶다 → TT-NN. 기존 JAX/PyTorch-XLA 코드를 그대로 올리고 싶다 → TT-XLA. 커스텀 커널을 최고 성능으로 → TT-Metalium(C++). 퓨전 커널을 파이썬으로 편하게 → TT-Lang. 대부분의 PyTorch 개발자는 TT-NN 또는 TT-XLA에서 시작합니다.
내 PyTorch 모델을 어떻게 올리나요?
두 가지 길이 있습니다. (1) TT-NN으로 재작성: from_torch로 가중치를 올리고 ttnn.linear/conv2d/...로 forward를 구성(06~10절 참고). (2) TT-XLA로 그대로: model.compile(backend="tt")(21~26절). 학습은 PyTorch에서 하고 가중치만 내보내 추론하는 패턴이 일반적입니다.
학습(training)도 되나요?
TT-NN은 추론 중심으로 autograd가 없습니다. 학습은 별도 프레임워크 tt-train을 사용하거나, PyTorch에서 학습 후 가중치를 내보내 추론하세요(06절).
어떤 모델이 내 하드웨어에 올라갈까요?
33~37절(모델 선택 가이드)의 가중치·KV 캐시 계산과 VRAM 계산기로 가늠하세요. 대략 add-in 카드(n150/n300)는 8B급, 멀티칩(t3k 등)은 70B급이 권장 조합입니다.
하드웨어 없이 공부할 수 있나요?
개념·코드는 이 페이지로 학습할 수 있고, TT-Lang은 pip install tt-lang-sim 시뮬레이터로 하드웨어 없이 커널 로직을 실행해 볼 수 있습니다(28절).
검정 테마 · Tenstorrent 개발자 가이드 · 모바일용
PC 환경 이용을 권장합니다. 본 콘텐츠는 PC 화면에 최적화되어 있어 전체 목차와 코드 예제를 PC에서 더욱 편하게 확인할 수 있습니다.
Tenstorrent NPU · 한국어 개발자 가이드

Tenstorrent에서
모델을 실행하고
커널을 작성하다

PyTorch·GPU 경험이 있는 개발자가 Tenstorrent NPU를 처음부터 끝까지 익히도록 만든 한국어 가이드입니다. 설치부터 고수준 TT-NN, 저수준 TT-Metalium, 프론트엔드 TT-XLA, 커널 DSL TT-Lang, 그리고 모델 선택·vLLM 배포까지 — 공식 리포지터리와 문서의 실제 코드를 그대로 임베드하고, 개념 이해 → 예제 실행 → 직접 구축의 학습 경로로 엮었습니다.

대상 · Tenstorrent 입문 개발자 언어 · Python · C++ 하드웨어 · Grayskull · Wormhole · Blackhole 출처 · tenstorrent/tt-metal
학습 경로 · 사용법

여기서 시작하세요 — PyTorch 개발자를 위한 학습 경로

이 페이지는 Python·PyTorch·GPU 경험이 있지만 Tenstorrent는 처음인 개발자를 위해 설계되었습니다. 아래 순서대로 따라가면 개념 이해 → 예제 실행 → 직접 포팅/커널 작성까지 도달합니다. 개념이 막히면 용어집·치트시트·FAQ를 참고하세요.

사전 지식 · Python · PyTorch · GPU 경험 예상 시간 · 핵심 경로 4~6시간 목표 · 이해 → 실행 → 직접 구축 진행률 · 자동 저장(체크박스)
00 시작하기 전에

하드웨어와 프로그래밍 모델 이해하기

코드를 읽기 전에, Tenstorrent 프로세서가 다른 가속기와 어떻게 다른지 짚고 갑니다. 이 개념들은 TT-NN과 TT-Metalium 모두에서 반복해서 등장합니다.

Tenstorrent의 AI 프로세서는 Tensix 코어들이 2차원 그리드 형태로 배열된 구조입니다. GPU처럼 하나의 거대한 SIMD 유닛이 아니라, 각각 독립적으로 프로그래밍 가능한 코어들이 NoC(Network-on-Chip)로 연결되어 있습니다. 각 Tensix 코어 안에는 5개의 RISC-V 코어가 들어 있고, 역할이 명확히 나뉩니다.

단일 Tensix 코어의 내부 구조
RISCV_0
데이터 무브먼트
UNPACK
컴퓨트
MATH
컴퓨트
PACK
컴퓨트
RISCV_1
데이터 무브먼트
FPU행렬 엔진 · matmul, add, reduce
SFPU벡터 엔진 · exp, sqrt, sin, relu…
L1 SRAM  코어 내부 스크래치패드 · Wormhole/Blackhole 기준 1.5 MB · 타일 단위 데이터 저장
▲ 2개의 데이터 무브먼트 코어가 NoC를 통해 DRAM ↔ L1 데이터를 옮기고, 3개의 컴퓨트 코어가 협력하여 FPU/SFPU를 구동합니다.
// TILE

타일(Tile) — 32×32

하드웨어의 거의 모든 연산은 32×32 값으로 이루어진 타일 단위로 이루어집니다. bfloat16 기준 한 타일은 32×32×2 = 2048바이트입니다. 텐서를 디바이스에 올릴 때 TILE_LAYOUT으로 변환하고, 32의 배수가 아닌 크기는 자동으로 패딩됩니다.

// MEMORY

L1(SRAM) vs DRAM

L1은 각 Tensix 코어 안에 있는 빠르고 작은 스크래치패드입니다(CPU의 L1 캐시와는 다릅니다). DRAM은 크지만 느립니다. 성능의 핵심은 데이터를 L1에 가깝게 유지하고 DRAM 왕복을 줄이는 것입니다.

// PIPE

서큘러 버퍼(Circular Buffer)

커널 사이의 통신 채널입니다. 리더 커널이 타일을 밀어넣고(push) 컴퓨트 커널이 꺼내(pop) 쓰는 FIFO 파이프입니다. Tensix 하나당 최대 32개까지 사용할 수 있으며, 더블 버퍼링으로 데이터 이동과 연산을 겹칩니다.

// ENGINE

FPU vs SFPU

FPU(행렬 엔진)는 matmul·덧셈·리덕션 같은 무거운 연산을 담당하고, SFPU(벡터 엔진)는 exp·sqrt·sin·ReLU 같은 복잡한 원소별 함수를 담당합니다. 커널에서 어떤 엔진을 쓰느냐에 따라 API가 달라집니다.

또한 TT-Metalium의 최신 API는 단일 디바이스도 1×1 메시(Mesh)로 취급합니다. MeshDevice, MeshCommandQueue, MeshBuffer를 사용하면 코드를 바꾸지 않고도 1개에서 수백 개의 디바이스로 확장할 수 있습니다. 모든 연산(업/다운로드, 프로그램 실행)은 커맨드 큐(Command Queue)에 순서대로 쌓여 비동기로 실행됩니다.

TT-NN이 지원하는 데이터 타입

타입비트용도트레이드오프
float3232고정밀 부동소수점정확도 높음, 메모리 많음
bfloat1616신경망 표준준수한 정확도, 메모리 2배 절약
bfloat8_b8추론, 대형 모델메모리 4배 절약, 정확도 하락
bfloat4_b4초경량 추론메모리 8배 절약, 최저 정확도
uint16 / uint3216 / 32정수 연산인덱싱·마스킹 등
◈ 정밀도(Math Fidelity)

FPU는 LoFiHiFi2HiFi3HiFi4의 4단계 정밀도 모드를 제공합니다. LoFi는 가장 빠르고 부정확하며, HiFi4는 완전한 FP32 누산으로 가장 정확합니다. 예제들에서 MathFidelity::HiFi4가 자주 등장하는 이유입니다.

GPU/PyTorch에서 오셨나요? — 개념 대응표

이미 GPU와 PyTorch에 익숙하다면 Tenstorrent 개념을 익숙한 것에 대응시켜 이해하는 편이 빠릅니다. 가장 큰 차이는 암묵적 SIMT 스케줄링(GPU) 대신 명시적 데이터 이동 + 정적 코어 분배(Tenstorrent)라는 점입니다.

GPU / PyTorchTenstorrent차이점
CUDA core / SMTensix 코어각 Tensix는 5개 RISC-V + FPU·SFPU. 워프 스케줄링이 아니라 명시적 데이터 이동으로 동작합니다.
warp / thread block코어 그리드 + 정적 분배동적 스케줄링·오버서브스크립션 없음. 코어 수만큼만 병렬이며 작업을 직접 나눕니다.
VRAM (HBM/GDDR)DRAM칩 외부 대용량 메모리 — 개념은 동일합니다.
shared memory / L1L1 (SRAM · 코어당)코어 내부 스크래치패드. 성능의 핵심은 데이터를 L1에 붙잡아 두는 것입니다.
tensor (row-major)타일 32×32 · TILE_LAYOUT하드웨어가 32×32 타일 단위로 연산. 올릴 때 타일 레이아웃으로 변환합니다.
fp16 / bf16bfloat16 · bfloat8_b · bfloat4_b블록 부동소수점으로 8·4비트까지 — 메모리·대역폭을 크게 절감합니다.
cuBLAS / cuDNNTT-NN 연산ttnn.matmul·ttnn.conv2d 등 즉시 쓰는 고수준 연산.
CUDA 커널 작성TT-Metalium · TT-Lang리더·컴퓨트·라이터 커널 + 서큘러 버퍼로 명시적 파이프라인을 구성합니다.
CUDA GraphMetal Trace연산 시퀀스를 녹화·재생해 호스트 오버헤드를 제거합니다.
NCCL (multi-GPU)CCL + TT-Fabric (mesh)all_gather·all_reduce로 멀티 디바이스 확장.
torch.compile / XLATT-XLA (PJRT)기존 JAX/PyTorch-XLA 그래프를 그대로 컴파일해 실행합니다.
◈ 가장 큰 사고방식 전환

GPU에서는 스케줄러가 알아서 워프를 배분하지만, Tenstorrent에서는 어떤 코어가 어떤 타일을 언제 처리할지를 프로그래머(또는 TT-NN 같은 상위 계층)가 결정합니다. 그래서 "데이터 이동"과 "타일"이 이 페이지 전반의 핵심 주제입니다.

01 시작하기 · 설치

설치 & 환경 구성 — tt-installer

한 줄 명령으로 드라이버·펌웨어·관리 도구까지 전체 Tenstorrent 스택 설치하기

Tenstorrent 가속기를 처음 받으면 가장 먼저 드라이버·펌웨어·관리 도구를 포함한 소프트웨어 스택을 설치해야 합니다. 공식 tt-installer 스크립트는 이 과정을 한 줄 명령으로 자동화합니다.

이 절에서는 지원 OS와 BIOS 요구사항, 한 줄 설치 명령, 설치 마법사가 순서대로 묻는 것들, 가상환경 활성화, tt-smi·lspci를 이용한 검증, 장치 리셋, 그리고 장치가 안 잡힐 때의 문제 해결까지 공식 문서의 명령을 그대로 정리합니다.

// STACK

스택 구성 요소

tt-kmd(커널 드라이버), tt-flash(펌웨어), tt-smi(관리·텔레메트리), HugePages, Python venv가 한 세트로 설치됩니다.

// ONE-LINE

한 줄 프로비저닝

curl로 최신 install.sh를 받아 실행하면 전체 스택을 자동 설치합니다. 의존성은 curl과 jq뿐입니다.

// VERIFY

검증과 리셋

tt-smi로 장치 인식을 확인하고, lspci -d 1e52로 PCIe 열거를, tt-smi -r로 오류 상태를 초기화합니다.

// OS

지원 환경

Ubuntu 22.04 LTS 권장. Ubuntu·Debian·Fedora 지원(신규 배포판은 실험적). BIOS의 PCIe AER은 OS First로 설정.

Tenstorrent 소프트웨어 스택은 여러 계층으로 구성됩니다. 커널 모드 드라이버(tt-kmd)가 PCIe로 연결된 가속기를 리눅스 커널에 노출하고, tt-flash가 보드 펌웨어를 갱신하며, tt-smi가 시스템 관리·텔레메트리를 담당합니다. 그 위에 TT-Metalium/TT-NN 개발 환경이 올라갑니다. 이 모든 구성 요소를 손으로 하나씩 설치하는 대신, 공식 편의 스크립트 tt-installer가 한 줄로 전체 스택을 프로비저닝합니다.

사전 준비 — OS · 하드웨어 · BIOS

권장 운영체제는 Ubuntu 22.04 LTS이며 Ubuntu·Debian·Fedora도 지원됩니다(더 최신 배포판은 실험적). 그 외에 인터넷 연결(패키지 다운로드), 관리자(sudo) 권한, 제품 매뉴얼에 따른 물리적 설치 완료가 필요합니다. 또한 BIOS에서 PCIe AER Reporting 항목을 OS First로 설정해야 합니다(TT-QuietBox 시스템은 자동 설정).

tt-installer는 curljq 두 의존성만 필요합니다(일부 배포판은 기본 설치되어 있지 않음). 먼저 설치해 둡니다.

한 줄 설치 명령

아래 명령이 tt-installer의 최신 릴리스 스크립트를 내려받아 실행합니다. 이 스크립트는 패키지 설치, DKMS 커널 모듈 추가, HugePages 설정을 위해 슈퍼유저(sudo) 권한을 요구합니다.

◈ 임의 스크립트 실행 주의

curl로 받은 스크립트를 곧바로 파이프로 실행하는 방식은 편리하지만, 스크립트가 root 권한으로 커널 모듈을 추가하고 HugePages를 구성한다는 점에서 위험을 동반합니다. 내부 정책이 엄격하다면 install.sh를 먼저 파일로 내려받아 검토한 뒤 실행하세요.

설치 마법사가 순서대로 묻는 것

대화형 모드로 실행하면 스크립트는 다음을 차례로 진행합니다. (1) 진행 확인에 Y, (2) sudo 비밀번호 입력, (3) TT-Metalium Slim 컨테이너(tt-nn/tt-metalium 릴리스 빌드 포함) 설치 여부 — TT-NN/TT-Metalium 개발 시 Y, (4) 모델 데모 컨테이너(전체 tt-metal, 약 10GB) 설치 여부, (5) Python 패키지 위치 선택, (6) TT-KMD·TT-Flash·시스템 펌웨어·HugePages·TT-SMI 자동 설치, (7) 첫 설치 시 재부팅(필수).

(5) Python 설치 위치는 네 가지 중에서 고릅니다: active-venv(현재 활성 환경 사용), new-venv(기본값/home/$USER/.tenstorrent-venv 생성), system-python(비권장), pipx(격리 설치).

Python 가상환경 활성화

기본 설치는 ~/.tenstorrent-venv에 가상환경을 만듭니다. tt-smi 등 파이썬 도구를 쓰려면 이 venv를 활성화합니다.

설치 검증 — tt-smi & lspci

재부팅이 끝나면 tt-smi를 실행해 장치가 정상 인식되는지 확인합니다. 출력의 Device Information 섹션에 표시되는 장치 수가 실제 설치한 하드웨어 수와 일치해야 합니다. PCIe 수준의 열거는 lspci -d 1e52(1e52 = Tenstorrent 벤더 ID)로 확인합니다.

장치 리셋

장치가 오류 상태에 빠지거나 재실행 전 초기화가 필요하면 tt-smi -r로 리셋합니다(수 초 소요). 남아 있는 프로세스와 공유 메모리를 먼저 정리하면 더 확실합니다.

문제 해결 — 장치가 안 잡힐 때

"No Tenstorrent devices detected!"가 뜨는 경우, Blackhole 카드(p100/p150)라면 먼저 전원을 점검하세요: 부팅 시 팬 회전과 녹색 LED를 확인합니다. 전원이 정상인데도 안 잡히면 카드를 리셋하고, lspci -d 1e52 결과가 비어 있으면 PCIe 열거 자체가 실패한 것입니다(재장착·슬롯 변경을 검토).

◈ 다음 단계

설치가 끝나면 본격적인 개발로 넘어갑니다. TT-NN(02절~)으로 모델을 실행하거나, 배포가 목표라면 모델 선택 가이드vLLM 추론 서버로 이어집니다. 상태 모니터링은 tt-smi(스냅샷)와 tt-toplike(실시간)로 합니다.

02 TT-NN · Python

TT-NN 소개 — 디바이스, 텐서, 레이아웃

TT-NN은 성능을 위해 C++로 구현되고 Python 바인딩을 제공하는 고수준 딥러닝 프레임워크입니다. PyTorch와의 상호 운용성이 핵심 강점입니다.

가장 먼저 할 일은 디바이스를 여는 것입니다. TT-NN 텐서는 호스트(CPU)디바이스(Tenstorrent 하드웨어) 두 곳에 존재할 수 있고, ttnn.from_torch / ttnn.to_torch로 PyTorch와 자유롭게 오갑니다.

레이아웃: ROW_MAJOR vs TILE

TT-NN에는 두 가지 텐서 레이아웃이 있습니다. ROW_MAJOR_LAYOUT은 전통적인 행 우선 저장 방식이고, TILE_LAYOUT은 32×32 타일 기반 저장 방식입니다. 하드웨어는 타일 레이아웃에 최적화되어 있으므로, 고성능 연산은 대부분 타일 레이아웃을 요구합니다.

L1(SRAM) 직접 제어와 메모리 관리

TT-NN은 텐서를 느린 DRAM에 둘지 빠른 L1에 둘지 명시적으로 제어할 수 있습니다. 연산을 이어서 수행할 때는 중간 텐서를 ttnn.deallocate로 즉시 해제해 L1의 제한된 용량을 아끼는 것이 중요합니다.

◈ JIT 컴파일 & 캐시

TT-NN은 커널을 실행 시점에(JIT) 컴파일합니다. 따라서 첫 실행은 느리고(컴파일), 이후 실행은 캐시된 커널로 빠릅니다. 텐서의 shape·dtype·레이아웃이 바뀌면 새 컴파일이 트리거됩니다. 뒤의 어텐션 예제에서 "program cache" 덕분에 두 번째 반복이 빨라지는 것을 직접 확인할 수 있습니다.

Metal Trace & 멀티 디바이스

프로덕션 추론에서는 Metal Trace로 연산 시퀀스를 녹화·재생하여 Python 오버헤드를 제거하고, 메시 디바이스로 여러 칩에 텐서를 샤딩(sharding)해 모델·데이터 병렬화를 구현합니다.

◈ 추론 전용

TT-NN은 추론(inference)에 최적화되어 있으며 자동 미분(autograd)을 포함하지 않습니다. 학습이 필요하면 별도 프레임워크인 tt-train을 사용하세요.

03 TT-NN · Python

텐서 더하기 — 첫 번째 디바이스 연산

가장 단순한 예제입니다. 두 개의 타일 텐서를 디바이스에서 원소별로 더합니다. TT-NN의 "열기 → 텐서 생성 → 연산 → 닫기" 흐름을 익히세요.

여기서는 ttnn.full로 값이 채워진 32×32 텐서 두 개를 디바이스에서 직접 만들고, ttnn.add로 더합니다. 두 텐서 모두 TILE_LAYOUT이라는 점에 주목하세요 — 하드웨어 연산의 전제 조건입니다.

04 TT-NN · Python

기본 텐서 연산 — 생성, 곱셈, 브로드캐스트

덧셈·원소별 곱셈·행렬 곱, 그리고 PyTorch/NumPy로부터의 텐서 생성과 브로드캐스트를 한 번에 살펴봅니다.

PyTorch 텐서를 ttnn.from_torch로 올리고, ttnn.zeros·ttnn.ones·ttnn.full로 디바이스에 직접 만들 수 있습니다. 연산은 ttnn.add, ttnn.mul, ttnn.matmul처럼 PyTorch와 거의 같은 이름을 씁니다.

05 TT-NN · Python

행렬 곱셈 — 메모리 배치와 코어 그리드

1024×1024 행렬 곱을 통해 @ 연산자, 레이아웃 변환, 그리고 L1 배치 + 코어 그리드 지정으로 성능을 끌어올리는 법을 봅니다.

ttnn.rand로 디바이스에 큰 행렬을 만들고 파이썬 @ 연산자로 곱합니다. 결과는 타일 레이아웃이므로, 사람이 읽으려면 to_layout으로 ROW_MAJOR로 바꿉니다. 마지막에는 입력을 L1에 배치하고 core_grid8×8 = 64개 코어에 연산을 분배해 성능을 높입니다.

◈ 왜 core_grid 인가

TT-NN은 고수준 API지만, core_grid·memory_config 같은 인자로 저수준 하드웨어 자원(어느 코어에서, 어느 메모리를 쓸지)을 제어할 수 있습니다. 이 아이디어를 밑바닥부터 직접 구현하는 것이 뒤의 TT-Metalium 행렬 곱 예제입니다.

06 TT-NN · Python

Conv2D — 합성곱과 NHWC 레이아웃

TT-NN의 conv2d는 PyTorch의 BCHW가 아니라 NHWC 레이아웃을 기대합니다. 입력을 permute·reshape하여 넘기는 패턴을 익힙니다.

PyTorch의 이미지 텐서는 (batch, channel, height, width) 순서지만, TT-NN conv2d는 채널이 마지막인 NHWC를 원합니다. 그래서 ttnn.permute로 축을 바꾸고, 공간 차원을 평탄화한 뒤 ttnn.Conv2dConfig와 함께 호출합니다. 또한 open_devicel1_small_size를 지정하는 점도 눈여겨보세요.

07 TT-NN · PyTorch

모델 학습 & 가중치 내보내기

TT-NN은 추론 전용(autograd 없음)입니다. 그래서 바로 다음 MLP·CNN 추론 예제가 불러오는 .pt 가중치 파일은 이 PyTorch 스크립트로 먼저 CPU에서 학습해 만들어 둡니다.

전체 흐름은 명확합니다 — 여기(PyTorch)에서 학습 → 저장, 다음 예제(TT-NN)에서 그 가중치를 로드 → Tenstorrent에서 추론. 먼저 MNIST용 3-레이어 MLP를 학습하고 W1..b3 텐서를 저장합니다.

CNN(CIFAR-10)도 동일한 패턴입니다. 표준 PyTorch로 학습한 뒤 state_dict 전체를 저장하면, CNN 추론 예제(08)가 이를 각각 TT-NN 텐서로 변환해 사용합니다.

◈ 왜 학습은 PyTorch에서?

TT-NN은 추론에 최적화된 프레임워크라 역전파(autograd)를 제공하지 않습니다. 따라서 "학습은 익숙한 PyTorch에서, 추론은 Tenstorrent에서"라는 분업이 자연스럽습니다. 디바이스 학습이 필요하면 별도 프레임워크 tt-train을 사용하세요. 가중치가 없으면 두 추론 예제는 랜덤 가중치로 폴백하므로(정확도는 낮음), 이 스크립트를 먼저 실행하는 것을 권장합니다.

08 TT-NN · Python

MLP 추론 — MNIST 손글씨 분류

3-레이어 MLP를 ttnn.linear + ttnn.relu로 구성해 실제 MNIST 이미지를 분류합니다. 첫 번째 end-to-end 모델입니다.

각 레이어는 가중치 전치 → 편향 reshape → ttnn.linear → ReLU 패턴을 따릅니다. 마지막 레이어만 ReLU 없이 로짓을 출력하고, ttnn.to_torch로 내려 argmax로 예측 클래스를 얻습니다.

09 TT-NN · Python

CNN 추론 — CIFAR-10 이미지 분류

합성곱 + 활성화 + 맥스풀링을 하나의 스테이지로 묶고, 두 스테이지를 쌓은 뒤 완전연결 층으로 분류하는 실전 CNN입니다.

핵심은 conv → ReLU → max_pool을 캡슐화한 conv_pool_stage 함수입니다. Conv2dConfig(activation=...)로 활성화를 합성곱에 융합하고, ttnn.max_pool2d로 다운샘플링합니다. 완전연결 단계에서는 다시 TILE_LAYOUTttnn.linear를 사용합니다.

10 TT-NN · Python

멀티헤드 어텐션 — Transformer의 심장

BERT 스타일 멀티헤드 어텐션을 두 가지 방식으로 구현합니다. 먼저 기본 연산 조합, 그다음 ttnn.transformer 융합 연산으로 최적화합니다.

첫 번째 버전은 @(matmul), permute, softmax 같은 기본 연산을 조합해 어텐션을 직접 구성합니다. Q·K·V를 각각 투영하고, 스코어를 √d로 스케일링한 뒤 마스크를 더하고 softmax를 취합니다.

두 번째 버전은 TT-NN이 제공하는 융합 트랜스포머 연산을 사용합니다. QKV를 하나의 linear로 계산하고, split_query_key_value_and_split_heads·attention_softmax_·concatenate_heads로 여러 단계를 한 번에 처리합니다. ttnn.deallocate로 중간 텐서를 적극 해제하고, bfloat8_b로 matmul을 가속하는 점도 실전 최적화 포인트입니다.

◈ Program Cache 효과

튜토리얼은 두 구현을 각각 두 번 실행하며 시간을 측정합니다. 첫 반복은 커널 컴파일 때문에 느리지만, 두 번째 반복은 program cache 덕분에 훨씬 빠릅니다. 마지막에는 두 구현의 결과를 피어슨 상관계수(PCC ≥ 0.95)로 비교해, 최적화 버전(bfloat8_b)과 기본 버전(bfloat16)의 정밀도 차이를 허용 범위 안에서 검증합니다.

11 TT-NN · Python

CLIP 제로샷 분류 — 실제 규모의 모델

지금까지의 예제를 종합하는 실전편입니다. OpenAI의 CLIP ViT-B/32 전체(비전 Transformer + 텍스트 Transformer)를 TT-NN 기본 연산만으로 구성해, 라벨 학습 없이 이미지를 텍스트 후보로 분류합니다.

CLIP은 이미지와 텍스트를 같은 임베딩 공간으로 인코딩한 뒤 코사인 유사도로 매칭합니다. 먼저 사전학습된 PyTorch 가중치를 TT-NN 텐서로 변환하고, 텍스트 인코더용 인과(causal) 마스크를 만듭니다.

모델의 반복 단위는 Residual Attention Block입니다. 앞서 배운 어텐션과 ttnn.layer_norm·ttnn.gelu를 잔차 연결로 엮습니다. 이 블록을 12개 쌓으면 하나의 Transformer 인코더가 됩니다.

비전 쪽은 이미지를 ttnn.conv2d패치 임베딩(32×32 패치 → 토큰)한 뒤 [CLS] 토큰과 위치 임베딩을 붙여 Transformer에 넣습니다. 마지막으로 이미지·텍스트 임베딩을 L2 정규화하고 스케일된 내적으로 유사도를 계산합니다.

◈ 이 예제가 종합하는 것

linear·matmul·softmax·layer_norm·gelu·conv2d·embedding·permute·concat 등 앞서 배운 연산들이 하나의 실제 모델로 합쳐집니다. PyTorch의 CLIP과 달리 TT-NN은 아직 고급 인덱싱을 완전히 지원하지 않아, EOT 토큰 선택 같은 일부 단계는 잠시 호스트(torch)로 내려 처리하는 하이브리드 패턴을 씁니다.

12 TT-NN · 도구

모델 트레이싱 — 연산 그래프 시각화

ttnn.tracer는 실행되는 연산들을 포착해 계산 그래프로 그려줍니다. torch 연산과 TT-NN 연산이 어떻게 흐르는지, 모델 구조를 눈으로 확인할 때 유용합니다.

사용법은 간단합니다. with trace(): 블록 안의 연산을 기록하고 visualize(결과)로 그래프를 렌더링합니다. 순수 torch 연산도, torch ↔ TT-NN 변환 흐름도 모두 추적됩니다.

동일한 방식으로 실제 모델 전체도 추적할 수 있습니다. 아래는 BERT 질의응답 추론을 통째로 trace()로 감싸 그래프화하는 예입니다.

◈ Visualizer와의 관계

트레이서가 연산의 논리적 그래프(무엇이 무엇으로 흐르는가)를 보여준다면, 다음 절의 TT-NN Visualizer는 여기에 메모리·성능 측정치를 더해 하드웨어 관점의 분석을 제공합니다. 트레이싱을 켜려면 enable_fast_runtime_mode를 꺼야 한다는 점이 공통입니다.

13 TT-NN · 도구

TT-NN Visualizer — 모델 프로파일링

모델이 하드웨어 자원을 어떻게 쓰는지 시각적으로 분석하는 도구입니다. 메모리 리포트와 성능 리포트를 생성해 업로드하면 연산·텐서·버퍼·그래프·성능 탭에서 병목을 찾습니다.
  • Operations — 모델의 모든 연산을 검색·필터하고 연산별 입출력 텐서와 메모리 배치를 확인
  • Tensors — 각 텐서의 shape·dtype·레이아웃·샤딩·배치(L1/DRAM)와 연산 간 이동을 추적
  • Buffers — 실행 중 사용된 모든 메모리 버퍼의 할당 위치·수명·재사용을 시각화
  • Graph — 연산을 노드로, 텐서 흐름을 엣지로 표현한 모델 구조도
  • Performance — 연산별 실행 시간·사용 코어 수·FLOPs·활용도, Matmul 최적화 힌트

워크플로는 두 단계입니다. 먼저 메모리 리포트pytest + 설정 파일로 생성하고, 성능 리포트tracy 프로파일러로 생성합니다.

◈ 더 보기

두 리포트 디렉터리를 Visualizer에 업로드하면 모든 분석 탭이 활성화됩니다. 자세한 내용은 ttnn-visualizer 저장소를 참고하세요.

14 TT-Metalium · C++

DRAM 루프백 — 가장 단순한 커널

데이터 무브먼트 코어가 DRAM의 데이터를 L1로 읽어들였다가 다시 DRAM으로 내보냅니다. 그래서 "루프백"입니다. Metalium API의 기본 골격을 익힙니다.

연산은 없지만, Metalium 프로그램의 모든 뼈대가 여기 있습니다: 메시 디바이스 생성, 커맨드 큐, 프로그램, 버퍼(L1·DRAM), 커널 생성, 런타임 인자, 워크로드 실행. 먼저 디바이스와 프로그램을 준비합니다.

버퍼는 3개입니다: 임시 저장용 L1 버퍼(1타일), 입력 DRAM 버퍼(50타일), 출력 DRAM 버퍼(50타일). bfloat16 한 타일은 32×32×2 = 2048바이트입니다. page_size를 타일 크기로 두면 데이터가 여러 뱅크에 라운드로빈으로 분산되어 높은 대역폭을 얻습니다.

이제 {0, 0} 코어에 데이터 무브먼트 커널을 생성합니다. TensorAccessorArgs는 뱅크 주소 계산과 페이지 크기를 자동으로 처리해 줍니다.

커널 본체는 타일을 하나씩 DRAM → L1 → DRAM으로 복사합니다. 주소가 포인터가 아니라 uint32_t인 이유는, DRAM이 커널에서 직접 주소 접근되지 않고 NoC를 통해 요청되기 때문입니다. 비동기 읽기/쓰기 뒤의 배리어가 데이터 정합성을 보장합니다.

마지막으로 런타임 인자를 설정하고 워크로드를 실행한 뒤, 결과를 내려받아 검증합니다.

15 TT-Metalium · C++

이항 연산 — FPU와 서큘러 버퍼

두 텐서를 FPU(행렬 엔진)로 원소별 덧셈합니다. 이 예제에서 서큘러 버퍼리더/컴퓨트/라이터 3-커널 파이프라인이 처음 등장합니다.

루프백은 커널 하나였지만, 실제 연산은 역할을 나눕니다. 리더가 DRAM에서 타일을 읽어 서큘러 버퍼에 밀어넣고, 컴퓨트가 꺼내 더한 뒤 결과를 다시 밀어넣고, 라이터가 DRAM으로 씁니다. 세 커널은 서큘러 버퍼(파이프)로 통신합니다.

RISCV_0
리더
DRAM → CB
Compute
컴퓨트
CB → FPU → CB
RISCV_1
라이터
CB → DRAM

서큘러 버퍼는 인덱스, 총 크기, 데이터 포맷, 페이지 크기로 정의합니다. 여기서는 2타일짜리 버퍼 3개(입력 2 + 출력 1)를 만들어 더블 버퍼링합니다. 입력은 c_0, c_1, 출력은 관례적으로 c_16을 씁니다.

세 커널을 생성합니다. 리더와 라이터는 DataMovementConfig(각각 RISCV_0/RISCV_1)로, 컴퓨트는 ComputeConfig로 만듭니다. ComputeConfigmath_fidelity가 FPU 연산 정밀도를 결정합니다.

컴퓨트 커널이 핵심입니다. FPU를 덧셈용으로 초기화하고, 루프마다 (1) 입력 타일을 기다리고, (2) 목적지 레지스터를 확보하고, (3) add_tiles로 더하고, (4) 결과를 출력 CB로 pack하고, (5) 입력 타일을 소비 처리합니다. 이 acquire → compute → commit → pack → release 패턴은 모든 컴퓨트 커널의 표준 형태입니다.

◈ 3개의 컴퓨트 코어

컴퓨트 커널은 사실 Unpack·Math·Pack 세 RISC-V 코어용으로 각각 컴파일되어 3개의 바이너리가 됩니다. 세 코어가 협력하여 데이터를 엔진에 넣고(Unpack), 계산하고(Math), 결과를 빼냅니다(Pack). 덕분에 데이터 이동과 연산이 동시에 진행되어 높은 처리량을 냅니다.

16 TT-Metalium · C++

단항 연산 — SFPU 벡터 엔진

이번엔 FPU 대신 SFPU(벡터 엔진)exp(x)를 계산합니다. SFPU는 exp·sqrt·sin·cos·ReLU 같은 복잡한 원소별 함수를 담당합니다.

구조는 이항 덧셈과 거의 같지만, 입력 버퍼가 하나이고 컴퓨트 커널이 FPU 대신 SFPU API를 호출합니다. SFPU 흐름은 init_sfpu → 연산별 init(예: exp_tile_init) → copy_tile → 연산(exp_tile) → pack 입니다.

리더/라이터 커널은 입력이 하나라는 점만 빼면 이항 예제와 동일합니다. 컴퓨트 커널을 만들 때 ComputeConfig{.math_approx_mode = false}로 근사 모드를 끄면 더 정확한 결과를 얻습니다. 검증은 호스트에서 std::exp와 비교합니다.

◈ FPU vs SFPU 정리

FPU는 행렬 곱·덧셈·리덕션처럼 규칙적이고 무거운 연산에, SFPU는 초월함수·활성화처럼 원소마다 복잡한 계산이 필요한 연산에 씁니다. 함수 이름에 _tile이 붙고 init_sfpu로 시작하면 SFPU 경로입니다.

17 TT-Metalium · C++

행렬 곱 — 싱글 코어

데이터 무브먼트와 컴퓨트가 본격적으로 협력하는 첫 예제입니다. 하나의 Tensix 코어에서 FPU로 타일 단위 행렬 곱을 수행합니다.

행렬 차원 M·K·N을 타일 차원 Mt·Kt·Nt로 환산합니다(하드웨어는 32×32 타일 단위). 호스트에서는 입력을 tilize_nfaces로 타일 레이아웃으로 바꾸고, CPU에서 골든 레퍼런스를 계산해 나중에 정확도를 검증합니다.

컴퓨트 커널이 핵심입니다. 출력 타일 하나를 계산할 때, K 방향으로 누산하는 안쪽 루프가 있습니다: tile_regs_acquire로 누산 레지스터를 0으로 초기화한 뒤, matmul_tilesKt번 호출해 부분곱을 더해 나갑니다. Mt·Kt·Nt는 컴파일 타임 인자로 넘겨 최적화합니다.

리더 커널은 타일을 읽는 순서가 중요합니다. 컴퓨트가 요구하는 순서(mt → nt → kt)에 맞춰, A는 mt*Kt + kt, B는 kt*Nt + nt 인덱스로 타일을 읽어 각 서큘러 버퍼에 밀어넣습니다.

실행 후 결과는 타일 레이아웃이므로 untilize_nfaces로 행 우선으로 되돌리고, 골든 레퍼런스와 피어슨 상관계수(PCC > 0.97)로 비교해 정확도를 검증합니다.

◈ 이 예제가 보여주는 핵심 패턴

데이터 이동과 연산의 분리(전용 RISC-V가 복잡한 접근 패턴을 처리하는 동안 FPU는 계속 계산), 타일 단위 연산(하드웨어 자연 단위), 더블 버퍼링 파이프라인(다음 타일을 미리 가져와 유휴 시간 최소화).

18 TT-Metalium · C++

행렬 곱 — 멀티 코어(SPMD)

싱글 코어 예제를 확장해, 가능한 많은 Tensix 코어에 일을 나눕니다. 출력 타일을 코어들에 분배하는 SPMD 전략을 씁니다.

API 자체는 거의 그대로입니다. 달라지는 건 일을 나누는 방식입니다. Metalium의 split_work_to_cores가 전체 출력 타일 수를 코어 수로 최대한 고르게 분배해 줍니다. 나누어떨어지지 않는 경우까지 알아서 처리합니다.

서큘러 버퍼와 커널은 단일 코어가 아니라 all_cores에 생성합니다. 그리고 각 코어마다 "몇 개의 타일을, 어디서부터" 처리할지 런타임 인자로 직접 지정합니다. Metalium은 CUDA/OpenCL과 달리 동적 스케줄링이 없으므로, 이 분배는 프로그래머의 몫입니다.

컴퓨트 커널은 IO를 신경 쓰지 않으므로, 싱글 코어 버전과 거의 같고 "할당받은 타일 수"만큼만 바깥 루프를 돕니다. 리더는 자신의 시작 타일 ID로부터 담당 출력 타일의 행·열을 계산해 필요한 A·B 타일을 읽습니다.

◈ 주의 — 정적 병렬화

CUDA/OpenCL은 코어보다 많은 작업 그룹을 던지면 하드웨어 스케줄러가 동적으로 배분·로드밸런싱합니다. 하지만 Metalium은 정적입니다. 코어 수보다 많은 작업을 동시에 던질 수 없고, 각 코어는 시작 시 할당된 몫만 처리한 뒤 유휴 상태가 됩니다. 그래서 작업을 고르게 나누는 것이 성능의 핵심입니다. 또한 커널을 생성한 코어에는 반드시 런타임 인자를 설정해야 하며, 그렇지 않으면 프로그램이 멈추거나 죽을 수 있습니다.

◈ 다음 단계

여기서 쓴 SPMD는 범용적이지만 최적은 아닙니다. Tenstorrent 아키텍처의 진짜 성능은 데이터 재사용(data reuse)멀티캐스트(multicast)를 활용한 시스톨릭 배열 패턴에서 나옵니다 — 한 번 읽은 A·B 타일을 여러 코어가 NoC로 공유하여 DRAM 접근을 줄이는 방식입니다. 이는 matmul_multi_core_optimized 예제에서 다룹니다.

19 TT-Metalium · 심화

행렬 곱 최적화 — 데이터 재사용 & 멀티캐스트

멀티 코어 SPMD는 범용적이지만 매번 DRAM에서 타일을 다시 읽습니다. 여기서는 데이터 재사용코어 간 멀티캐스트로 Tenstorrent 아키텍처의 진짜 성능을 끌어냅니다.

① 데이터 재사용 — 서브블록과 중간 CB

블록을 더 잘게 나눈 서브블록(subblock) 단위로 연산하고, 부분합(partial result)을 중간 서큘러 버퍼(c_24)에 쌓아 재사용합니다. 최적 블록/서브블록 크기는 get_large_matmul_params가 계산해 줍니다.

재사용의 핵심은 컴퓨트 커널에서 이전 블록의 부분합을 되불러와(reload) 이어서 누산하는 것입니다. 마지막 블록에서야 최종 출력이 완성됩니다.

② 멀티캐스트 — 코어 간 데이터 브로드캐스트

더 나아가, 타일을 코어마다 따로 읽는 대신 한 번 읽어 여러 코어에 NoC로 뿌립니다. 코어 그리드를 역할별로 나눠, 왼쪽 열은 in0 행을 아래로, 위쪽 행은 in1 열을 옆으로 멀티캐스트하고, 나머지 코어는 받아서 계산합니다("torrent"라는 이름 그대로 데이터가 흐릅니다).

MASTERsend
in1send↑
in1send↑
in1send↑
in0send→
compute
compute
compute
in0send→
compute
compute
compute
in0send→
compute
compute
compute
마스터 송신 (0,0) in0 행 송신 (왼쪽 열) in1 열 송신 (위쪽 행) 수신 + 부분합 계산

코어들은 CoreRange로 역할 그룹을 나누고, 이른 송수신을 막기 위해 세마포어로 동기화합니다.

◈ 참고

멀티캐스트 예제는 4개의 서로 다른 데이터플로 커널(in0 송신/수신, in1 송신+라이터/수신+라이터)을 역할 그룹별로 배치하고, 컴퓨트 커널에는 바이어스 덧셈 + 활성화 함수를 융합(bmm_large_block_zm_fused_bias_activation)합니다. 이 특정 mcast 예제는 Grayskull 전용이라는 점에 유의하세요. 실제 프로덕션에서는 이러한 최적화를 TT-NN의 ttnn.matmul이 내부적으로 자동 적용합니다.

20 TT-Metalium · 심화

커스텀 SFPU 연산 — SFPI로 직접 작성

표준 라이브러리에 없는 나만의 원소별 연산이 필요하다면? SFPI(SFPU Interface)는 C++로 SFPU 벡터 엔진을 직접 프로그래밍하는 라이브러리입니다. 32-wide 벡터, FP32/INT32, 완전한 조건부 실행을 지원합니다.

먼저 가장 단순한 예 — 벡터 덧셈입니다. 컴퓨트 커널의 흐름은 기존 SFPU 예제와 같지만, 표준 함수 대신 커스텀 함수 my_add_tile를 호출합니다.

커스텀 연산은 계층적으로 구현합니다. 저수준 my_add_tile_face는 타일의 한 face(16×16)에 대해 vFloat SIMD 벡터로 실제 계산을 하고, 고수준 my_add_tileMATH() 매크로로 감싸 math 스레드에서만 4개 face를 순회 실행합니다.

한 단계 더 나아가 smoothstep을 구현하면 두 가지 고급 기능을 볼 수 있습니다: 커널에 스칼라 파라미터 전달과, 레인별 조건 분기인 벡터 프레디케이트(v_if/v_elseif/v_endif).

◈ 계층 구조의 이점

vConst0·vConst1은 하드웨어가 미리 준비한 0.0/1.0 벡터 상수로, 리터럴을 벡터로 브로드캐스트하는 오버헤드를 없애 줍니다. 입력 개수에 따라 SFPU_UNARY_/BINARY_/TERNARY_CALL_NO_TEMPLATE_ARGS 매크로를 골라 씁니다. 이 계층 패턴 덕분에 고수준 로직과 하드웨어 세부사항이 분리됩니다.

◈ 안정성 경고

SFPI 매크로·LLK 헬퍼는 내부 API이며 Tenstorrent는 하위 호환을 보장하지 않습니다. 또한 벡터 폭(위 예제의 32)은 아키텍처 의존적입니다(현재 Wormhole·Blackhole 기준). 커스텀 SFPI 코드는 항상 최신 Metalium 릴리스에 맞춰 유지하세요.

21 TT-XLA · 프론트엔드

TT-XLA 개요 & 설치

이미 JAX/PyTorch-XLA로 짜인 모델을 코드 변경 없이 Tenstorrent에서 실행하기

TT-XLA는 XLA/StableHLO를 통해 컴파일되는 프레임워크(JAXPyTorch/XLA)가 Tenstorrent 하드웨어에서 실행되도록 해주는 PJRT 플러그인입니다. TT-NN이나 TT-Metalium처럼 전용 API로 새로 작성하는 대신, 기존 XLA 코드를 최소한의 변경으로 가속기에 올리고 싶을 때 쓰는 진입점입니다.

이 그룹은 개요·설치부터 JAX/PyTorch 예제, 혼합 정밀도, 코드 생성, 모델 실행까지를 개별 섹션으로 다룹니다.

// PJRT

PJRT 백엔드 통합

pjrt-plugin-tt로 JAX·PyTorch/XLA를 Tenstorrent에 연결합니다. StableHLO 그래프를 입력으로 받습니다.

// STACK

tt-mlir 위에서 동작

프레임워크 → StableHLO → PJRT → tt-mlir → tt-metal → 디바이스. 단일·멀티 칩 모두 지원합니다.

// FRAMEWORKS

JAX & PyTorch

JAX는 jit(backend="tt"), PyTorch는 model.compile(backend="tt")+xla_device(). 구형 TT-Torch를 대체합니다.

// PRECISION

혼합 정밀도 · codegen

레이어별 가중치 dtype 오버라이드와, 컴파일 결과를 파이썬 코드로 내보내는 codegen을 지원합니다.

TT-XLA는 공식 표현으로 "a PJRT-based backend integration that enables JAX and PyTorch/XLA to run on Tenstorrent AI hardware"입니다. JAX/PyTorch가 모델을 StableHLO 그래프로 낮추면, TT-XLA의 PJRT 플러그인이 이를 tt-mlir 컴파일러로 넘기고, tt-metal 런타임을 거쳐 Wormhole·Blackhole에서 실행됩니다. 멀티 칩도 지원하며 과거 PyTorch용이던 TT-Torch를 대체합니다.

설치 — 휠 (권장)

모델을 실행만 하려면 미리 빌드된 휠을 설치합니다. 추가 인덱스에서 pjrt-plugin-tt를 설치한 뒤 tt-forge-install로 시스템 의존성을 채웁니다.

설치 — Docker & 소스

컨테이너로 실행하려면 슬림 이미지를, 소스 빌드 시에는 몇 가지 시스템 의존성을 설치합니다.

22 TT-XLA · 프론트엔드

JAX 예제 — 선형 회귀

JAX 코드는 거의 그대로 둡니다. 핵심은 jit(..., backend="tt")로 컴파일 백엔드만 Tenstorrent로 지정하는 것입니다. 표준 vmap·grad·jit를 그대로 씁니다.

23 TT-XLA · 프론트엔드

PyTorch 예제 — MNIST

PyTorch는 PyTorch/XLA를 통해 지원됩니다. 모델을 model.compile(backend="tt")로 컴파일하고 xm.xla_device()가 반환하는 디바이스로 옮기면 됩니다.

컴파일러 옵션 & eager 모드

컴파일 외에 세부 제어와 즉시 실행(eager)도 가능합니다. examples/pytorch/compiler_options.py(옵션), test_eager_mode.py(eager), export_ir_example.py(IR 내보내기)를 참고하세요.

24 TT-XLA · 프론트엔드

혼합 정밀도 — 레이어별 dtype 오버라이드

전체를 균일하게 양자화하면 민감한 레이어에서 정확도가 떨어질 수 있습니다. TT-XLA는 텐서(가중치)별로 dtype을 지정할 수 있어, 대부분을 bfp_bf8/bfp_bf4로 낮추고 일부만 bf16으로 유지할 수 있습니다(현재 matmul·linear 가중치만 지원).

25 TT-XLA · 프론트엔드

코드 생성 (codegen)

컴파일 결과를 독립 실행 가능한 파이썬 코드로 내보낼 수 있습니다. compiler_optionsbackendexport_path를 지정하면 디버깅·이식에 활용할 수 있습니다.

26 TT-XLA · 프론트엔드

모델 실행 & 멀티칩 예제

저장소의 예제를 내려받아 곧바로 실행할 수 있습니다.

예제 저장소에는 실제 규모의 모델이 다수 포함됩니다: ResNet, Llama, Qwen3, Mistral, GPT-OSS-20B, OLMo3, Stable Diffusion(v1.4~XL). 또한 멀티칩(n300)의 데이터·텐서 병렬 추론과 CCL 연산, 직렬화 예제도 있습니다.

◈ 더 알아보기

성능 개선, 모델 자동 탐색 테스트, op 퓨전/합성, PyTorch/XLA 소스 빌드, Explorer 시각화 도구 등은 공식 문서의 해당 페이지에서 다룹니다.

27 TT-Lang · 커널 언어

TT-Lang 개요 & 프로그래밍 모델

TT-NN과 TT-Metalium 사이의 표현력 있는 중간 지대 — 파이썬 임베디드 커널 DSL

TT-Lang은 Tenstorrent 하드웨어용 고성능 커스텀 커널을 작성하기 위한 파이썬 임베디드 DSL입니다. 고수준 TT-NN 연산과 저수준 TT-Metalium 사이의 간극을 메워, 퓨전 커널을 표현하면서도 파이프라이닝·동기화를 원할 때만 세밀하게 제어할 수 있게 해줍니다(점진적 공개).

이 그룹은 프로그래밍 모델·설치부터 Elementwise·Matmul 튜토리얼, 완전한 커널 예제, 디버깅까지를 개별 섹션으로 다룹니다.

// DSL

파이썬 임베디드 DSL

@ttl.operation 안에 @ttl.compute·@ttl.datamovement 커널을 모아 정의합니다. ttnn.Tensor를 그대로 인자로 받습니다.

// MIDDLE

TT-NN ↔ TT-Metalium

TT-NN은 퓨전이 어렵고 TT-Metalium은 저수준 부담이 큽니다. TT-Lang은 그 중간에서 컴파일러 보조 자원 관리를 제공합니다.

// DATAFLOW

데이터플로 버퍼(DFB)

reserve()/push()로 생산, wait()/pop()으로 소비하는 L1 통신 파이프. 커널 사이 데이터를 동기화합니다.

// SCALE

노드 → 멀티디바이스

grid/node로 코어 그리드에 분배하고, ShardTensorToMesh·all_reduce로 여러 디바이스까지 확장합니다.

연산 함수@ttl.operation()로 감싼 파이썬 함수로, 그 안에 정의된 커널 함수들이 자동 수집·컴파일됩니다. 커널 함수는 @ttl.compute()(수학) 또는 @ttl.datamovement()(메모리 전송)로 표시합니다.

연산은 노드들로 이루어진 그리드 위에서 실행됩니다. ttl.grid_size(dims)는 그리드 크기를, ttl.node(dims)는 현재 노드 좌표를 돌려줍니다. 커널 사이 통신은 데이터플로 버퍼(DFB)로 하며, 생산자는 reserve()·push(), 소비자는 wait()·pop()을 씁니다. DFB에서 꺼낸 메모리 단위가 블록입니다.

28 TT-Lang · 커널 언어

설치 & 함수형 시뮬레이터

하드웨어가 있으면 PyPI로 설치합니다(Python 3.12 권장). 하드웨어 없이 로직만 검증하려면 시뮬레이터 전용 패키지를 씁니다.

함수형 시뮬레이터 & 검증

설치 후 예제를 시뮬레이터로 바로 실행해 동작을 확인합니다. 커널을 순수 파이썬으로 실행하므로 하드웨어 없이 로직을 검증할 수 있습니다.

29 TT-Lang · 커널 언어

튜토리얼 ① Elementwise (step 0 → 4)

공식 Elementwise 튜토리얼은 a*b + c*d 같은 원소별 연산을 5단계로 발전시킵니다. step 0은 TT-NN 기준선으로, 연산마다 따로 디스패치되어 중간 결과가 DRAM을 왕복합니다(메모리 병목).

step 1은 TT-Lang의 전체 모델을 도입합니다: @ttl.operation(grid=(1,1)) 아래 compute·reader·writer 세 커널이 동시에 돌고, L1의 DFB로 통신하며 하나의 퓨전 커널로 계산합니다.

step 2는 타일을 GRANULARITY×GRANULARITY 패치로 묶어 동기화 오버헤드를 줄이고, step 3grid=(4,4)로 여러 노드에 병렬화하며, step 4grid="full"로 그리드를 컴파일러가 정하게 하고 올림 나눗셈·경계 검사로 나눠떨어지지 않는 분배까지 처리합니다.

30 TT-Lang · 커널 언어

완전한 예제 — eltwise_add 커널

두 텐서를 타일 단위로 더하는 완전한 커널입니다(step 4 형태). @ttl.operation이 그리드 분배를, @ttl.compute가 덧셈을, 두 @ttl.datamovement가 입력 읽기·출력 쓰기를 담당합니다.

31 TT-Lang · 커널 언어

튜토리얼 ② Matmul (step 0 → 7)

Matmul 튜토리얼은 단일 노드에서 멀티디바이스까지 확장합니다. step 0은 TT-NN 기준선(relu(A@B + C)), step 1은 K 방향으로 누산하는 단일 타일 커널입니다.

step 2는 블록으로 묶어 활용도를 높이고, step 3~4는 M×N 출력을 코어 그리드에 분배합니다. 이후는 멀티디바이스입니다: step 5는 M 차원을 ShardTensorToMesh(dim=0)로 샤딩(K×N 복제, 통신 불필요), step 6은 K 차원 샤딩 후 호스트 합산, step 7ttnn.all_reduce로 TT-Fabric 위 온-디바이스 리덕션을 수행합니다.

32 TT-Lang · 커널 언어

에러 & 디버깅

examples/errors/에는 흔한 실수의 재현 예가 있습니다: 데드락(eltwise_add_deadlock.py), copy 잠금 오류(copy_lock_error.py), DFB 과다 경고(max_dfbs_warning.py). 동기화 순서가 어긋나면 데드락이 나므로 reserve/wait 짝을 맞추는 것이 중요합니다. 진단은 print-debugging·compiler-options·performance-tools 문서를 참고하세요.

◈ 언제 TT-Lang을 쓰나

여러 TT-NN 연산을 하나로 퓨전해 중간 텐서의 DRAM 왕복을 없애고 싶은데 TT-Metalium으로 밑바닥부터 짜기엔 부담이 클 때가 TT-Lang의 자리입니다. 간단한 커널은 최소한만 적고, 성능이 필요할 때만 파이프라이닝·동기화를 세밀하게 제어합니다.

33 배포 · 모델 선택

모델 선택 가이드 — VRAM 계산기

이 모델이 내 하드웨어에 올라갈까? — 가중치·KV 캐시·정밀도로 메모리 가늠하기

모델을 서빙하기 전에 반드시 확인할 것은 "이 모델이 내 장치 메모리에 올라가는가"입니다. 파라미터가 많거나 컨텍스트가 길수록 요구 메모리가 커지고, 정밀도(양자화)를 낮추면 줄어듭니다. VRAM 계산기 (cv-learn.com)는 모델·정밀도·컨텍스트를 입력하면 필요한 메모리를 추정해 줍니다.

이 배포 그룹은 먼저 모델 선택(VRAM)을 다루고, 이어서 vLLM 추론 서버 배포로 넘어갑니다.

// WEIGHTS

가중치 메모리

파라미터 수 × 정밀도 바이트. 고정 비용이며 정밀도로 2~8배까지 줄일 수 있습니다.

// KV CACHE

KV 캐시

컨텍스트 길이·배치에 선형 비례. 긴 컨텍스트에서는 가중치보다 큰 병목이 되기도 합니다.

// PRECISION

정밀도 · 양자화

BF16 → bfloat8_b → bfloat4_b로 낮출수록 절감됩니다. Tenstorrent가 기본 지원합니다.

// FIT

적합성 판단

가중치 + KV 캐시 + 오버헤드 합이 장치 메모리에 들어오는지로 모델을 고릅니다.

VRAM 계산기는 모델(또는 파라미터 수), 양자화/정밀도, 컨텍스트 길이(그리고 배치)를 입력받아 필요한 메모리를 가중치 + KV 캐시 + 오버헤드로 나누어 추정합니다. 다음 세 섹션에서 각 요소의 원리를 봅니다.

cv-learn VRAM 계산기 화면 — 모델·하드웨어·양자화·컨텍스트 입력과 메모리 결과(FITS 여부)
cv-learn VRAM 계산기 — 모델·하드웨어(Blackhole p150a 등)·양자화·컨텍스트를 입력하면 가중치 · KV 캐시 · 활성화 · 오버헤드로 나눠 필요 메모리와 FITS 여부를 보여줍니다. Tenstorrent(tt-vllm / tt-metal) 서빙 프레임워크도 고를 수 있습니다.
34 배포 · 모델 선택

① 가중치 메모리 — 파라미터 × 정밀도

가중치가 차지하는 메모리는 파라미터 수 × 파라미터당 바이트로 결정되며, 컨텍스트와 무관한 고정 비용입니다. 정밀도를 낮추면(양자화) 선형으로 줄어듭니다.

35 배포 · 모델 선택

② KV 캐시 — 컨텍스트가 길수록 폭증

생성 추론에서는 이전 토큰들의 key/value를 캐시합니다. 이 KV 캐시컨텍스트 길이·배치에 선형 비례하므로 2K에서 넉넉하던 모델이 32K에서는 메모리를 초과할 수 있습니다.

36 배포 · 모델 선택

③ 정밀도로 메모리 줄이기 (양자화)

정밀도를 낮추는 것은 메모리를 줄이는 가장 효과적인 수단으로, 품질 저하를 최소화하며 2~4배까지 절감합니다. Tenstorrent는 bfloat16bfloat8_bbfloat4_b를 기본 지원합니다(트레이드오프는 00절 데이터 타입 표 참고).

◈ VRAM 계산기 사용법

cv-learn VRAM 계산기에 모델·정밀도·컨텍스트를 입력하면 가중치·KV 캐시·오버헤드 합계를 보여줍니다. 이 값을 장치 메모리와 비교해 그대로 올릴지·정밀도를 낮출지·컨텍스트를 줄일지·더 작은 모델로 갈지 결정하세요.

37 배포 · 모델 선택

실전 예 & Tenstorrent 하드웨어 매핑

실전 예 — 8B vs 70B

두 모델을 정밀도별로 대략 계산하면 어느 하드웨어에 맞는지 감이 옵니다(가중치만).

하드웨어 → 권장 모델

공식 tt-inference-server 문서의 하드웨어별 검증 조합입니다. 위 계산으로 용량을 가늠한 뒤 출발점으로 삼으세요.

◈ 다음 단계 — 서빙

모델을 골랐다면 이어지는 vLLM 서버 섹션에서 위 DEVICE·MODEL 값으로 서버를 띄웁니다.

38 배포 · vLLM 서버

vLLM 추론 서버 — 개요 & 메시 토폴로지

vLLM 기반 tt-inference-server로 OpenAI 호환 LLM 서버 띄우기
// ENTRYPOINT

tt-inference-server란

vLLM과 tt-metal을 Tenstorrent에서 연결하는 배포 도구. Docker·모델 다운로드·서빙 설정을 자동화합니다.

// RUN.PY

단일 명령 배포

run.py에 --workflow server --docker-server를 주면 Docker 셋업과 서버 기동이 자동입니다.

// AUTH

JWT 인증

JWT_SECRET으로 서명한 토큰(pyjwt)을 Bearer 헤더로 전달해 API를 호출합니다.

// OPENAI API

OpenAI 호환

포트 8000에서 /v1/completions 등 OpenAI 표준 API를 제공합니다.

공식 문서는 tt-inference-server를 "Tenstorrent 하드웨어에서 추론을 서빙할 모델을 배포·테스트하는 가장 빠른 방법"으로 소개합니다. vLLM과 tt-metal을 연결해 Docker·가중치 다운로드·서빙을 자동화하고 OpenAI 호환 엔드포인트를 노출합니다.

◈ 사전 요구사항

루트 파티션 최소 360GB 여유, 비루트 Docker, 가중치 다운로드용 인터넷이 필요합니다. Wormhole 계열(QuietBox/LoudBox)은 배포 전 메시 토폴로지를 먼저 구성합니다.

(Wormhole 전용) 메시 토폴로지

39 배포 · vLLM 서버

모델 접근 & 하드웨어 선택

Llama 같은 게이트된 모델은 Hugging Face에서 접근 요청을 승인받고 토큰을 발급해 export 합니다.

시스템에 맞춰 DEVICE·MODEL을 지정합니다(MODEL 값에는 meta-llama/ 접두어를 붙이지 않습니다).

◈ 어떤 모델을 고를지 모르겠다면

같은 배포 그룹의 VRAM 계산기 섹션에서 용량을 먼저 가늠하세요.

40 배포 · vLLM 서버

서버 실행 (run.py + Docker)

각 모델 구현은 미리 빌드된 릴리스 Docker 이미지에 매핑되므로 최신 버전 태그를 체크아웃합니다.

JWT_SECRET을 설정한 뒤 run.py로 서버를 기동합니다. 첫 실행은 가중치 다운로드에 30분 이상, 초기화에 70B는 약 40분·8B는 약 10분이 걸릴 수 있습니다.

41 배포 · vLLM 서버

상태 확인 & API 키 발급

서버가 준비되면 /health가 200을 반환합니다. API 키는 JWT_SECRET으로 서명한 JWT로, pyjwt로 만듭니다.

42 배포 · vLLM 서버

OpenAI 호환 API 호출

엔드포인트는 http://localhost:8000이며 /v1/completions 등 OpenAI 표준 경로를 제공합니다. 첫 요청은 워밍업으로 느립니다.

Python OpenAI 클라이언트

curl 대신 OpenAI 파이썬 클라이언트로 동일 엔드포인트를 호출할 수 있습니다. base_url만 바꾸면 됩니다.

43 배포 · vLLM 서버

확장 — 임베딩 모델 & 도구

LLM 외에 BGE-M3, Qwen3-Embedding, TinyLlama 같은 모델도 서빙할 수 있습니다. 저장소 examples/vllm/ 아래 각 모델 폴더의 service.sh(서버 기동)와 client.py(요청)를 참고하세요.

◈ 다음 단계

실시간 코어 활동·전력·메모리 트래픽은 tt-toplike로, 포인트-앤-클릭 배포·채팅 UI는 TT-Studio로 확인할 수 있습니다. 로컬 vLLM 엔드포인트는 Aider 같은 도구와도 연동됩니다.

44 부록 · 학습 자료

용어집 — Tenstorrent 핵심 용어

이 페이지에 반복 등장하는 용어를 한곳에 모았습니다. 아래 검색창에 한글·영문·키워드를 입력해 바로 찾으세요.
일치하는 용어가 없습니다.
NPU Neural Processing Unit
AI 연산 전용 가속기. Tenstorrent의 Grayskull·Wormhole·Blackhole 칩이 여기에 해당합니다.
Tensix 코어 Tensix core
칩의 기본 연산 단위. 5개의 RISC-V + FPU(행렬) + SFPU(벡터) + L1 SRAM으로 구성되며, 2D 그리드로 배열됩니다.
RISC-V baby cores
Tensix 내부의 프로그래머블 코어. 2개는 데이터 이동, 3개(Unpack·Math·Pack)는 컴퓨트를 담당합니다.
NoC Network-on-Chip
코어와 DRAM을 잇는 온칩 네트워크. 모든 데이터 이동이 이 경로로 이뤄집니다.
타일 Tile (32×32)
32×32 값 묶음. 하드웨어 연산의 기본 단위이며 bfloat16 기준 2048바이트입니다.
L1 (SRAM) on-core memory
코어 내부의 빠르고 작은 스크래치패드. 성능의 핵심은 데이터를 L1에 붙잡아 두어 DRAM 왕복을 줄이는 것입니다.
DRAM off-chip memory
칩 외부 대용량 메모리. L1보다 크지만 느립니다.
서큘러 버퍼 Circular Buffer
커널 사이를 잇는 FIFO 파이프. 리더가 push, 컴퓨트가 pop. Tensix당 최대 32개.
FPU Matrix Engine
행렬 곱·덧셈·리덕션 등 규칙적이고 무거운 연산을 담당하는 엔진.
SFPU Vector Engine
exp·sqrt·sin·ReLU 등 복잡한 원소별 함수를 담당하는 엔진.
bfloat16/8_b/4_b block float
신경망용 저정밀 포맷. 낮출수록 메모리·대역폭을 절감(2~8배)하며 정확도는 하락합니다.
TILE_LAYOUT / ROW_MAJOR layout
타일 기반 / 행 우선 텐서 저장 방식. 고성능 연산은 대부분 TILE_LAYOUT을 요구합니다.
Program Cache JIT cache
JIT 컴파일된 커널 캐시. 첫 실행은 느리고 두 번째 실행부터 빨라집니다.
Math Fidelity LoFi~HiFi4
FPU의 정밀도 모드. LoFi(빠름·부정확)~HiFi4(완전 FP32 누산·정확).
Mesh / MeshDevice device mesh
여러 디바이스(또는 1×1 단일)를 하나로 다루는 추상. 코드 변경 없이 확장 가능.
Command Queue FIFO
업/다운로드와 프로그램 실행을 순서대로 처리하는 비동기 FIFO 큐.
Kernel reader/compute/writer
코어에서 실행되는 코드. 데이터 이동 커널(리더·라이터)과 컴퓨트 커널로 나뉩니다.
tilize / untilize
행 우선 ↔ 타일 레이아웃 변환. 디바이스에 올릴 때 tilize, 읽어올 때 untilize.
Sharding 샤딩
텐서를 여러 코어/디바이스에 분산 배치해 데이터 이동을 줄이는 기법.
CCL collective comms
all_gather·all_reduce 등 멀티 디바이스 집합 통신 연산.
TT-Fabric
디바이스 간 고속 인터커넥트. 온-디바이스 리덕션 등에 활용됩니다.
Metal Trace
연산 시퀀스를 녹화·재생해 Python 호스트 오버헤드를 제거하는 기능.
PJRT
XLA 백엔드 플러그인 인터페이스. TT-XLA가 이를 구현해 JAX/PyTorch-XLA를 연결합니다.
StableHLO SHLO
XLA의 중간 표현(그래프). 프레임워크가 이 형태로 낮춘 뒤 tt-mlir로 넘어갑니다.
tt-mlir
TT-XLA·TT-Forge 아래에 있는 MLIR 기반 컴파일러 스택.
PCC Pearson corr.
피어슨 상관계수. 디바이스 결과와 기준값의 유사도로 정확도를 검증(예: > 0.97).
HugePages
대용량 페이지 메모리. tt-installer가 설치 시 구성합니다.
tt-smi / tt-topology / tt-flash / tt-kmd
관리·텔레메트리 / 메시 구성 / 펌웨어 / 커널 드라이버 도구.
Dataflow Buffer (DFB) TT-Lang
TT-Lang에서 커널 사이를 잇는 L1 통신 버퍼. reserve/push/wait/pop으로 다룹니다.
Core Grid 코어 그리드
연산에 사용할 Tensix 코어의 2D 집합. 작업을 이 그리드에 정적으로 분배합니다.
45 부록 · 학습 자료

치트시트 — 자주 쓰는 명령 & 연산

작업 중 바로 찾아 쓰는 빠른 참조: 설치·검증 명령, GPU↔TT 코드 대응, TT-NN 핵심 연산, dtype 선택.

설치 · 검증 · 리셋

GPU/PyTorch ↔ TT-NN 코드 대응

PyTorch (GPU)TT-NN설명
x.cuda()ttnn.from_torch(x, layout=ttnn.TILE_LAYOUT, device=dev)텐서를 디바이스로
x.cpu()ttnn.to_torch(x)호스트로 복귀
a @ bttnn.matmul(a, b) 또는 a @ b행렬 곱
F.linear(x, w, b)ttnn.linear(x, w, bias=b)선형 계층
F.relu(x)ttnn.relu(x)활성화
F.softmax(x, -1)ttnn.softmax(x, dim=-1)소프트맥스
nn.Conv2dttnn.conv2d(...) (NHWC)합성곱 — 입력은 NHWC
torch.float16ttnn.bfloat16 / bfloat8_b정밀도
device="cuda:0"ttnn.open_device(device_id=0)디바이스 열기

TT-NN 핵심 연산

연산용도비고
ttnn.from_torch / to_torchtorch ↔ TT-NN 변환dtype·layout·device 지정
ttnn.to_layoutTILE ↔ ROW_MAJOR고성능 연산은 TILE
ttnn.matmul / linear행렬 곱 / 선형core_grid·memory_config로 튜닝
ttnn.add / mul / sub원소별 연산브로드캐스트 지원
ttnn.deallocate중간 텐서 해제L1 절약에 필수
ttnn.transformer.*어텐션 융합 연산split_qkv, attention_softmax_ 등
ttnn.all_gather / all_reduce멀티 디바이스 통신메시에서 사용

dtype 선택 가이드

◈ 어떤 도구를 쓸까?

TT-NN — PyTorch식으로 빠르게 모델 실행(대부분 여기서 시작). TT-Metalium — C++로 커널을 밑바닥부터. TT-XLA — 기존 JAX/PyTorch-XLA 코드를 그대로. TT-Lang — 퓨전 커널을 파이썬 DSL로(둘의 중간). 자세한 결정은 아래 FAQ를 참고하세요.

46 부록 · 학습 자료

문제 해결 & FAQ

처음 겪기 쉬운 오류와 자주 묻는 질문을 모았습니다. 항목을 눌러 펼치세요.

자주 겪는 오류

"No Tenstorrent devices detected!" — 장치가 안 잡혀요
lspci -d 1e52로 PCIe 열거를 먼저 확인하세요. 비어 있으면 전원(팬·LED)·재장착을 점검합니다. 열거는 되는데 안 잡히면 tt-smi -r로 리셋하고, 드라이버가 로드됐는지(tt-smi) 확인합니다.
L1 메모리 부족 / Out of Memory
중간 텐서를 ttnn.deallocate()로 즉시 해제하고, 큰 텐서는 memory_config=ttnn.DRAM_MEMORY_CONFIG로 DRAM에 두세요. conv 등은 open_device(l1_small_size=8192)로 작업 공간을 확보합니다. L1은 코어당 1~1.5MB로 작습니다.
레이아웃 / 포맷 관련 에러
고성능 연산은 TILE_LAYOUT을 요구합니다. ttnn.to_layout(x, ttnn.TILE_LAYOUT)로 변환하세요. conv2d 입력은 NHWC여야 하므로 ttnn.permute로 축을 바꿉니다. 32의 배수가 아닌 크기는 타일로 자동 패딩됩니다.
첫 실행이 너무 느려요
TT-NN은 커널을 JIT 컴파일합니다. 첫 실행은 컴파일 때문에 느리고, 같은 shape·dtype·layout이면 program cache 덕분에 두 번째부터 빨라집니다. 벤치마크는 두 번째 반복 이후로 측정하세요.
정확도가 기대보다 낮아요
정밀도를 확인하세요 — bfloat8_b/bfloat4_b는 메모리를 아끼는 대신 정확도가 떨어집니다. 행렬 곱은 MathFidelity::HiFi4로 올리고, 검증은 allclose 대신 PCC(피어슨 상관계수)로 하는 것이 관례입니다(예: > 0.97).
vLLM 서버가 안 떠요 / 느려요
디스크 여유(최소 360GB), Docker 비루트 실행, 게이트 모델은 HF_TOKEN 승인을 확인하세요. Wormhole 시스템은 tt-topology -l mesh로 메시를 먼저 구성해야 합니다. 첫 기동은 가중치 다운로드+초기화로 수십 분 걸릴 수 있습니다.

자주 묻는 질문

TT-NN, TT-Metalium, TT-XLA, TT-Lang 중 무엇을 써야 하나요?
모델을 빠르게 실행하고 싶다 → TT-NN. 기존 JAX/PyTorch-XLA 코드를 그대로 올리고 싶다 → TT-XLA. 커스텀 커널을 최고 성능으로 → TT-Metalium(C++). 퓨전 커널을 파이썬으로 편하게 → TT-Lang. 대부분의 PyTorch 개발자는 TT-NN 또는 TT-XLA에서 시작합니다.
내 PyTorch 모델을 어떻게 올리나요?
두 가지 길이 있습니다. (1) TT-NN으로 재작성: from_torch로 가중치를 올리고 ttnn.linear/conv2d/...로 forward를 구성(06~10절 참고). (2) TT-XLA로 그대로: model.compile(backend="tt")(21~26절). 학습은 PyTorch에서 하고 가중치만 내보내 추론하는 패턴이 일반적입니다.
학습(training)도 되나요?
TT-NN은 추론 중심으로 autograd가 없습니다. 학습은 별도 프레임워크 tt-train을 사용하거나, PyTorch에서 학습 후 가중치를 내보내 추론하세요(06절).
어떤 모델이 내 하드웨어에 올라갈까요?
33~37절(모델 선택 가이드)의 가중치·KV 캐시 계산과 VRAM 계산기로 가늠하세요. 대략 add-in 카드(n150/n300)는 8B급, 멀티칩(t3k 등)은 70B급이 권장 조합입니다.
하드웨어 없이 공부할 수 있나요?
개념·코드는 이 페이지로 학습할 수 있고, TT-Lang은 pip install tt-lang-sim 시뮬레이터로 하드웨어 없이 커널 로직을 실행해 볼 수 있습니다(28절).

회사명 : 웨이브파이브 주식회사

팩스번호 : 031-522-0514

사업자등록증 : 723-81-03036

대표자 : 윤덕노

주소 : 경기도 안양시 동안구 흥안대로427번길 47 

LDC비즈타워 617-618호


이메일 : contact@wavefive.ai



Customer Center

1661-2026


월 - 금 : 09:00 ~ 18:00

주말 및 공휴일 휴무

파트너사 홈페이지