6월이 되었다. 날씨가 부쩍 더워졌음을 느낀다. 작년에 비해 여름이 늦게 찾아와서 그런걸까, 28도, 29도의 날씨도 뜨거운 한여름처럼 느껴진다. 저번 달부터 캠프에는 미니 선풍기를 휴대하는 사람들이 많이 보이기 시작했다. 그도 그럴 것이 출근길은 1초도 땀을 식힐 시간이 없다. 대중교통 안에서 냉방을 최대로 운행해주지만, 콩나물 시루처럼 붐비는 사람들 사이에 끼어 있으면 의미가 전혀 없다. 땀이 많은 나는 그런 상황이 싫어서 가급적 일찍 오려 하지만, 어떤 수를 쓰더라도 옷이 땀에 젖는 걸 피할 수 없다. 조만간 오래도록 사용할 성능 좋은 미니 선풍기를 장만해야겠다.
💻 What?
이번 주는 수업에 이틀 밖에 참여하지 못했다.
- 6월 2일 (월): HuggingFace 기초에 대해 배웠다. Transfer Learning과 Fine Tuning에 대해 배우고, Pipeline을 통해 pretrained model들을 사용해봤다.
- 6월 3일 (화): 제21대 대통령 선거일.
- 6월 4일 (수): HuggingFace AutoClass를 이용해 간단한 Fine Tuning을 실습하고, 실습 결과를 HuggingFace Hub에 업로드했다. 다음 수업 부터 Langchain과 여러 LLM API를 이용하기 때문에 API 인증 키 발급 및 일부 유료 API 사용을 위한 크레딧 구매 등의 사전 작업들을 진행했다. 수업이 끝난 뒤엔 선거로 연기된 코딩 테스트 스터디를 진행했다.
- 6월 5일 (목): 예비군 기본 훈련으로 인한 공가 사용.
- 6월 6일 (금): 현충일.
😮 So What?
♚♚허깅☆페이스♚♚$$♜머신러닝★안전★놀이터♜
저번 주 NLP 기초 부분 수업을 마친 뒤, 이번 주에는 본격적으로 LLM(Large Language Model)에 대해 배우기 시작했다. 이번 주는 LLM 기초 지식 다지기와 Hugging Face 다루기, API 다루기 시간이었다. Hugging Face는 다양한 분야에서 활용되는 다양한 인공 지능 모델, 데이터셋, 서비스 등을 공유하는 플랫폼이다. 이번에 처음 알게 되었는데, Transformer 모델의 확산과 활용에 엄청난 기여를 했다고 한다. Hugging Face에서 제공하는 transformers 라이브러리는 수많은 pre-trained Transformer 모델을 제공하고, 사람들이 쉽게 학습시키고 배포할 수 있는 환경을 구축했다. Transformer 뿐만 아니라 Google Gemma, DeepSeek R1, text-to-image Diffusion Model인 Stable Diffusion 등 약 170만 개의 다양한 모델을 만나볼 수 있다.
일단 수업 시간에는 KcBERT pre-trained model에 네이버 영화 후기 데이터를 fine tuning하여 Hub에 업로드했다(Hugging Face는 Hugging Face Hub라는 모델 형상 관리 서비스도 제공한다).
from datasets import load_dataset
nsmc = load_dataset('e9t/nsmc', trust_remote_code = True)
trainset = nsmc['train'].shuffle().select(range(10000))
testset = nsmc.get('test').shuffle().select(range(5000))
from transformers import AutoTokenizer, AutoModelForSequenceClassification
tokenizer = AutoTokenizer.from_pretrained('beomi/kcbert-base')
model = AutoModelForSequenceClassification.from_pretrained(model_id, num_labels = 2)
train_X, test_X, train_y, test_y = trainset['document'], testset['document'], trainset['label'], testset['label']
train_encoding = tokenizer(train_X, return_tensors = 'pt', padding = True)
test_encoding = tokenizer(test_X, return_tensors = 'pt', padding = True)
import torch
from torch.utils.data import Dataset, DataLoader
class NSMCDataset(Dataset):
def __init__(self, comments, labels):
"""
생략
"""
Trainer() 객체에 모델 관련 정보를 넣어서 모델을 학습시키고, 학습 관련 Parameter를 TrainingArguments() 객체로 정의하여 Trainer()의 Argument로써 바로 사용할 수 있었다.
from transformers import TrainingArguments, Trainer
N_EPOCHS = 3
BATCH_SIZE = 64
train_args = TrainingArguments(
output_dir = 'models/nsmc',
num_train_epochs = N_EPOCHS,
per_device_train_batch_size = BATCH_SIZE,
per_device_eval_batch_size = BATCH_SIZE,
eval_strategy = 'epoch', # 'no', 'step', 'epoch'
save_strategy = 'epoch',
save_total_limit = 1,
load_best_model_at_end = True, # Save and Load. subject to: eval_strategy = save_strategy
# 헷갈렸던 점이다. Best Model은 output_dir root path에
# total limit에 해당하는 가장 최근 n개의 checkpoint는 각각의 개별 하위 디렉토리에 저장된다고 한다.
metric_for_best_model = 'eval_loss',
greater_is_better = False, # 만약 설정한 metric이 Loss Function이라면, Less is better일 것이다.
report_to = 'none'
# push_to_hub = True
# hub_model_id = "MODEL_ID"
# hub_token = "Access Token"
)
trainer = Trainer(
model = model,
args = train_args,
train_dataset = train_set, # torch.utils.data.Dataset # trainer.train()
eval_dataset = test_set, # trainer.evaluate()
compute_metrics = my_compute_metrics # default = loss function
)
저번주에 nsmc 데이터셋을 활용하여 힘겹게 Sentiment Analysis 모델을 구현한 기억이 있는데, HuggingFace의 여러 라이브러리들을 이용하니 고성능의 pre-trained 모델과 데이터셋을 불러와 비교적 손쉽게 미세 조정 후 배포까지 할 수 있었다. 이게 머신러닝 놀이터가 아니고서야 무엇이란 말인가? 할 수 있는게 너무 많아서 어떤 것부터 해봐야할 지 감이 안오는 수준이다. 나중에 무언가 머리에서 번뜩이면 허깅페이스에 먼저 접속해봐야겠다.

실습 결과물입니다. 성능을 보장하지 않습니다.
Langchain과 여러 LLM API
목요일은 Langchain이라는 프레임워크를 사용하기 시작한 날이다. 예비군 이슈로 당일 수업을 듣지 못했지만, 당일 저녁과 금요일에 걸쳐 복습을 실시했다. 마침 같이 기본 훈련을 받은 친구도 처리해야 할 업무가 있어서, 동네로 돌아온 뒤 저녁을 먹고 군복 차림으로 근처 카페로 함께 향했다. 강사님이 push해주신 강의안을 살펴보며 여러 실습코드들을 따라해봤다. 설치할 라이브러리가 굉장히 많은데 강의실에서도 집에서도 코드를 돌려보고 싶어서, git repository를 새로 만든 뒤 requirements.text, .env, .gitignore 등의 초기 설정을 마치고 복습을 시작했다. 아직 모델만 만져본 것 같아서 혼자서도 충분히 따라갈 만했다.
Langchain: LLM-based App을 build하는데 주로 사용되는 Open Source Framework. 다양한 LLM 모델과 호환되고, 여러 Task 간 chained structure를 통해 작업들을 Pipeline처럼 유연하게 연계할 수 있다. RAG(Retrieval Augmented Generation)을 지원하여 untrained data에 대응할 수 있게 도와주고, 모델이 결과 예측에 있어 외부 자원들을 능동적으로 사용할 수 있게 권한을 부여하기도 한다. 이러한 어려운 기능들을 UI 뒤에 추상화하여, 개발자가 코드 몇 줄 딸깍 하면 App을 간편하게 build할 수 있도록 설계되어 있다.
# 질의-응답 기본 구조
from langchain_openai import ChatOpenAI
prompt = [
('user', '막걸리 제조법을 알려줘.') # ('role', 'message')
]
model = ChatOpenAI(
model = 'gpt-4o-mini',
temperature = 1,
max_tokens = 100
)
response = model.invoke(prompt)
print(response.content)
# Using HuggingFace
from langchain_huggingface.llms import HuggingFacePipeline
model_id = 'google/gemma-3-1b-it' # 1 billion params, instruction training
model_hf = HuggingFacePipeline.from_model_id(
model_id = model_id,
task = 'text-generation',
pipeline_kwargs = {"max_new_tokens":50} # setting for transformers.pipeline()
)
response = model_hf.invoke('한국의 수도는 어디에요?')
print(response.content)
Ollama
: Local 환경에서도 Open Source LLM을 간편하게 돌려봐요
ollama pull MODEL_NAME
ollama run MODEL_NAME
pull: 설치만.run: 터미널 환경에서 실행. 안 깔려 있으면 설치도 진행.
from langchain_ollama import ChatOllama
model = ChatOllama(model = 'qwen3:0.6b')
response = model.invoke('한국의 수도는 어디에요?')
print(response.content)
# Google Gemini
from langchain_google_genai import ChatGoogleGenerativeAI
model = ChatGoogleGenerativeAI(
model = 'gemini-2.5-flash-preview-05-20'
)
response = model.invoke('gemini와 gemma의 차이는?')
print(response.content)
# LLM들은 Markdown 문법에 맞게 답변을 생성하는 경우가 많습니다.
# Python의 기본 출력 환경은 Markdown 렌더링을 제공하지 않지만
# 라이브러리를 이용해 Markdown 문법을 적용하여 출력할 수 있습니다.
from IPython.display import Markdown
Markdown(response.content)

🎈 Now What?
일단 저번 주 회고록에서 예고했던 대로, Attention Mechanism에 대해 내가 이해한 것들을 후속 포스팅으로 남겼다. 연산 과정을 벡터 간 dot-product가 아닌 행렬 곱으로 표현했는데, 잘 한 일인지 모르겠다. 나는 행렬 곱으로 표현하는 게 더 이해가 잘 되어서 그렇게 써내려갔는데, 다른 분들은 어떨지... 어쨌든 이 포스팅을 시작으로 AI&ML이라는 카테고리를 비정기적으로 관리할 것 같다. 다음 포스팅은 Transformer에 대한 내용을 다루게 될 것 같은데, 이번 주에 공부해서 바로 올릴 수 있으면 하는 바람이다. Attention is All You Need를 읽어보고 있는데, 모델 구조가 상당히 복잡하다.
다음 주에는 풀 수업이 예정되어 있다. 수업을 이틀만 듣다가 5일 동안 연달아서 수업을 들으면 상대적으로 피곤할 것이다. 주말 동안 재충전을 잘 해서 좋은 컨디션으로 수업에 임해야겠다.
여담

모교 근처 카페로 주말 데이트를 다녀왔다. 카멜커피 상도점이라는 곳으로, 작은 터널의 바로 위쪽이라는 신기한 자리에 위치해 있다. 강남, 연남동, 서촌 등 여러 핫플에서 인기를 끄는 브랜드인데, 2023년에 동작구 상도동에도 오픈한 모양이다. 건물 외벽부터 내부까지 애니메이션 속의 숲속 벽돌집에 들어온 것 같은 분위기를 자아냈고, 연인들과 여행객, 그리고 학교 후배님들로 추정되는 공부에 열중인 학생들까지 여러 사람들이 한 장소에 어우러져 있었다. 시그니처 커피와 말차 레몬 에이드도 맛있었다. 오후 4시에 방문했는데 베이커리가 모두 품절이어서 아쉬웠다.
'SKN_13th' 카테고리의 다른 글
| [플레이데이터 SK네트웍스 Family AI 캠프 13기] 13주차 회고 (2) | 2025.06.22 |
|---|---|
| [플레이데이터 SK네트웍스 Family AI 캠프 13기] 12주차 회고 (6) | 2025.06.14 |
| [플레이데이터 SK네트웍스 Family AI 캠프 13기] 월간 회고: 5월 (0) | 2025.05.31 |
| [플레이데이터 SK네트웍스 Family AI 캠프 13기] 9주차 회고 (0) | 2025.05.25 |
| [플레이데이터 SK네트웍스 Family AI 캠프 13기] 8주차 회고 (0) | 2025.05.18 |