OpenAI Structured Outputs strict 모드, 스키마 에러 원인 정리

OpenAI API로 함수 호출(function calling) 기능을 쓰다 보면 어느 순간 strict: true라는 옵션을 마주치게 됩니다. 이게 Structured Outputs라는 기능인데, 기존 function calling과 뭐가 다른지 헷갈리는 경우가 많습니다. 이 글에서는 OpenAI Structured Outputs strict 모드가 일반 function calling과 구조적으로 어떻게 다른지, 그리고 스키마를 작성할 때 왜 “Invalid schema” 같은 에러가 발생하는지를 실제 코드와 함께 정리합니다. 읽고 … Read more

seed를 다 고정했는데 매번 결과가 다른 이유 — PyTorch 완전 재현성 체크리스트

torch.manual_seed(42)까지 넣었는데도 똑같은 코드, 똑같은 데이터로 돌릴 때마다 loss 값이 미묘하게 달라진 경험이 있으실 겁니다. seed를 다 고정했는데 매번 결과가 다른 이유는 사실 대부분 seed 하나만으로는 절대 막을 수 없는 GPU 연산 특성과 데이터 로딩 구조에 있습니다. 이 글에서는 seed 고정 이후에도 남아있는 재현성 구멍을 하나씩 짚고, 실제로 동작하는 코드로 막는 방법을 정리합니다. torch.manual_seed()가 못 … Read more

VRAM 8GB로 batch size 256 효과 내기 — Gradient Accumulation 정확 구현과 흔한 3가지 실수

GPU 메모리가 8GB인 환경에서 batch size 256을 그대로 올리면 대부분 OOM(Out of Memory)이 발생합니다. VRAM 8GB로 batch size 256 효과 내기는 실제로는 물리적 배치를 작게 유지하면서 그래디언트를 여러 번 누적해 큰 배치와 동일한 업데이트를 만드는 방식으로 해결하는데, 이 글에서는 PyTorch 기준으로 정확히 동작하는 Gradient Accumulation 코드와 실무에서 자주 발생하는 3가지 실수를 구체적으로 다룹니다. 이론적 설명보다 … Read more

CUDA device-side assert triggered — 스택트레이스가 엉뚱한 이유와 진짜 위치 찾는 법

PyTorch로 모델을 학습시키다가 RuntimeError: CUDA error: device-side assert triggered를 만나면 대부분 당황합니다. 에러 메시지가 가리키는 줄을 아무리 들여다봐도 코드에 문제가 없어 보이기 때문입니다. 이는 우연이 아니라 CUDA의 비동기 실행 구조 때문에 생기는 필연적인 현상입니다. 이 글에서는 왜 스택트레이스가 엉뚱한 위치를 가리키는지, 그리고 실제 오류가 발생한 줄을 정확히 찾아내는 구체적인 절차를 다룹니다. 왜 스택트레이스가 엉뚱한 곳을 … Read more

loss가 갑자기 NaN으로 튈 때 — 5가지 원인 체크리스트와 register_hook 디버깅

학습을 몇 시간 돌리다가 loss가 갑자기 NaN으로 튀는 상황은 PyTorch로 모델을 만들어본 사람이라면 한 번쯤 겪는 문제입니다. 로그를 아무리 들여다봐도 “어느 레이어에서, 어느 연산에서” NaN이 시작됐는지 알기 어렵기 때문에 감으로 학습률만 낮추다 끝나는 경우가 많습니다. 이 글에서는 loss가 NaN으로 튀는 5가지 대표 원인을 체크리스트로 정리하고, register_hook과 register_forward_hook으로 NaN이 발생한 정확한 지점을 찾아내는 실전 디버깅 코드를 … Read more

Colab에서 CUDA out of memory 뜰 때: 배치사이즈·gradient accumulation·AMP로 해결하기

Colab에서 모델을 학습시키다가 RuntimeError: CUDA out of memory를 마주치면 진행 중이던 학습이 그대로 멈춰버립니다. 특히 무료 티어의 T4(16GB)나 Colab Pro의 A100 일부 사양에서도 배치 사이즈를 조금만 키우면 바로 터지는 경우가 많습니다. 이 글에서는 배치사이즈 조정, gradient accumulation, AMP(자동 혼합 정밀도) 세 가지를 실제 코드와 함께 조합하는 방법을 정리합니다. 단순히 “배치를 줄이세요”에서 끝나지 않고, 왜 그렇게 … Read more

내 PC에서 무료로 LLM 돌리기: Ollama로 llama3 설치하고 파이썬에서 호출까지

클라우드 API에 매번 요금을 내지 않고도 내 PC에서 무료로 LLM을 돌리는 방법을 찾고 있다면 Ollama가 가장 현실적인 선택지입니다. 이 글에서는 Ollama를 설치해 llama3 모델을 내려받는 과정부터, 터미널에서 대화하는 법, 파이썬 코드로 직접 호출해 응답을 받아오는 방법까지 실제로 실행되는 명령어와 코드로 정리합니다. 설치 경로 선택, 모델 용량, 파이썬 라이브러리와 REST API 방식의 차이까지 다뤄서 따라 하기만 … Read more

캐글 타이타닉 정확도 80% 넘기기, baseline 76.5%에서 올린 3단계

캐글(Kaggle) 타이타닉 생존자 예측 대회에 처음 제출하면 대부분 0.76555라는 애매한 점수를 받게 됩니다. 이 글은 그 숫자가 어디서 나오는지 짚어보고, 캐글 타이타닉 정확도 80% 넘기기를 실제로 달성하기 위해 baseline 76.5%에서 순서대로 올린 3단계(성별·등급 규칙 → 특성공학 → 모델 교체)를 코드와 함께 정리합니다. 캐글 계정을 막 만들고 첫 제출을 앞둔 분이라면 이 순서대로 따라 하는 것만으로 … Read more

PyTorch로 MNIST CNN 만들기: MLP vs CNN 정확도·파라미터 수 비교

MNIST 손글씨 숫자 분류는 PyTorch를 처음 배울 때 누구나 거치는 실습이지만, 막상 “MLP와 CNN 중 뭐가 더 나은가”를 숫자로 비교한 자료는 의외로 드뭅니다. 이 글에서는 PyTorch로 MNIST CNN 만들기 과정을 단계별 코드로 보여드리면서, 같은 데이터셋에 대해 MLP와 CNN의 파라미터 수를 직접 계산하고 구조적 차이가 왜 정확도 차이로 이어지는지 정리했습니다. 코드를 그대로 복사해서 실행하면 model.parameters()로 직접 … Read more

Hugging Face pipeline 3줄 감정분석, 한국어에서 틀리는 이유와 해결법

transformers 라이브러리의 pipeline(“sentiment-analysis”)은 코드 3줄이면 감정 분석 결과가 나오는 것으로 유명합니다. 그런데 이 3줄 코드를 한국어 문장에 그대로 쓰면 결과가 이상하게 나오는 경우가 많습니다. 이 글에서는 Hugging Face pipeline 3줄 감정분석이 왜 한국어에서 틀리는지 토크나이저 레벨에서 원인을 확인하고, 실제로 쓸 수 있는 한국어 모델 교체 방법까지 정리합니다. 3줄 감정분석 코드, 한국어를 넣으면 무슨 일이 벌어지나 … Read more