⭐PyTorch / TensorFlow ◦ 용도: 모델 훈련, 미분 계산, 텐서 연산 ◦ [PyTorch] • 직관적이고 디버깅이 쉬워 LLM 연구와 실험에 널리 사용됨 • Hugging Face와의 연동도 뛰어남 ◦ [TensorFlow] • 구글 생태계(GCP, TFX 등)와 잘 통합되며, 대규모 배포에 적합 • 최근에는 PyTorch보다 덜 사용됨
Hugging Face ⭐Transformers ◦ 용도: 사전학습된 LLM 모델 불러오기, fine-tuning, inference • 사전학습된 모델 (GPT, BERT, T5, LLaMA 등)을 쉽게 사용할 수 있게 해주는 라이브러리 • 학습/추론에 필요한 tokenizer, 모델 구조, config 등을 자동으로 관리 • 텍스트 생성, 분류, QA, 요약 등 다양한 작업에 최적화된 pipeline 제공
from transformers import AutoModelForCausalLM, AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("gpt2")
model = AutoModelForCausalLM.from_pretrained("gpt2")
inputs = tokenizer("Hello, my name is", return_tensors="pt")
outputs = model.generate(**inputs)
print(tokenizer.decode(outputs[0]))
Datasets (Hugging Face Datasets) ◦ 용도: 대규모 데이터셋 로딩, 전처리, 분할 • 데이터셋을 빠르고 효율적으로 불러오고 사용할 수 있도록 지원 • 대용량 파일도 메모리에 무리 없이 스트리밍 처리 가능 ◦ Hugging Face Hub에서 바로 불러올 수 있음
from datasets import load_dataset
dataset = load_dataset("wikitext", "wikitext-2-raw-v1")
print(dataset["train"][0])
Accelerate / DeepSpeed / bitsandbytes ◦ 용도: 대규모 모델 훈련 시 하드웨어 최적화, 메모리 절약 • Accelerate: 다양한 하드웨어(CPU, GPU, TPU)에 맞게 모델 학습 코드 자동 조정 • DeepSpeed: 마이크로소프트에서 만든 초대형 모델 훈련 최적화 툴 • bitsandbytes: 8bit/4bit 양자화 학습 및 추론 지원 → 적은 메모리로 대형 모델 사용 가능
PEFT (Parameter-Efficient Fine-Tuning) ◦ 용도: LLM을 빠르고 저렴하게 파인튜닝 (LoRA, Prefix Tuning 등) • 기존 LLM 전체가 아닌 일부 파라미터만 훈련해서 훨씬 적은 자원으로 fine-tuning 가능 • 대표 기법: LoRA (Low-Rank Adaptation)
from peft import LoraConfig, get_peft_model
⭐Tokenizers ◦ 용도: LLM에 입력될 텍스트를 토큰 단위로 인코딩 • Hugging Face의 tokenizers는 빠르고 확장성 높은 토크나이저 • Byte-Pair Encoding (BPE), WordPiece, SentencePiece 등 다양한 방식 지원
⭐LangChain / ⭐LlamaIndex ◦ 용도: LLM 응용 프로그램 구축 (질의 응답, RAG, 에이전트 등) •LangChain: 다양한 LLM, 데이터 소스, 도구를 연결해 에이전트처럼 동작하게 함 •LlamaIndex: 사용자 문서를 LLM에 연결해 QA 시스템 구축에 유용 (RAG)
WandB / TensorBoard ◦ 용도: 모델 학습 과정 모니터링, 로그 기록, 하이퍼파라미터 튜닝 • 실험 추적 및 시각화를 위한 필수 툴 • 학습 정확도, 손실값, GPU 메모리 사용량 등 확인 가능
LlamaIndex는 **언어 모델(LLM)**과 **외부 데이터(문서, DB 등)**를 연결해주는 데이터 프레임워크입니다.
• LlamaIndex = LLM + 외부 데이터 연결을 쉽게 만들어주는 도구
LLM은 자체적으로 인터넷이나 PDF, 데이터베이스 같은 구조화되지 않은 데이터에 접근할 수 없습니다. LlamaIndex는 이런 데이터들을 정리하고 쪼개고 인덱싱해서, LLM이 쉽게 "질문-답변", "요약", "검색 기반 생성(RAG)" 등을 할 수 있게 도와주는 라이브러리입니다.
• LlamaIndex가 할 수 있는 작업
◦ 문서 로딩 : PDF, Word, HTML, Notion, Airtable 등 다양한 형식의 문서를 읽어옴
◦ Chunking : 문서를 적절한 크기로 나눔 (LLM이 다루기 쉽게)
◦ Embedding + Indexing : 문서를 벡터화하고 검색 가능한 인덱스를 만듦
◦Query Engine : 사용자 질문을 받아서 적절한 문서 찾고 답변 생성
• 주요 예시
from llama_index import VectorStoreIndex, SimpleDirectoryReader
# 문서 로딩
documents = SimpleDirectoryReader("data/").load_data()
# 인덱스 생성 (벡터화 포함)
index = VectorStoreIndex.from_documents(documents)
# 질의 엔진 생성
query_engine = index.as_query_engine()
# 질의
response = query_engine.query("이 회사의 수익 모델은 무엇인가요?")
print(response)
• 핵심 구성 요소
◦ Document : 원본 텍스트 데이터 ◦ Node : 문서에서 쪼갠 텍스트 블록 (보통 하나의 파라그래프 단위) ◦ Index : 벡터 기반 검색 인덱스 (FAISS, Chroma 등 지원) ◦ Query Engine : 질의 → 검색 → 응답 생성 파이프라인 ◦ Retriever : 관련 문서를 찾는 부분 ◦ Response Synthesizer : 관련 문서들을 종합해서 답변 생성
• 사용 목적
◦ 내 회사 문서를 기반으로 GPT 질의 응답 ◦ PDF 논문 요약 ◦ SQLite, Notion, Airtable 등 다양한 데이터 연결 ◦ RAG (Retrieval-Augmented Generation)
기본적으로, Regression analysis (회귀 분석)은 몇 개의 독립변수 (예 : 배경음악)를 처리하는 과정이 반드시 필요하며, 그 이유는 독립변수가 종속변수 (예 : 가게에 머무는 시간)에 어떤 영향을 끼치는 지 알아보고자 하기 때문입니다. 이는 독립변수가 변화함에 따라서, 종속변수 값이 어떻게 변화하는지를 묘사합니다.
회귀분석은 몸무게, 속도, 또는 나이와 같은 연속 수치 값으로 분석했을 때 최상의 결과를 도출해낼 수 있습니다.
일반 적인 회귀 분석의 활용
고객 만족도와 고객 충성도와의 관계를 도출할 수 있음.
이웃 주민과 그 규모가 주택 가격에 어떤 영향을 주는지를 확인할 수 있음
점포와 역 사이의 거리가 멀면 멀수록 매출이 오르는지 내리는지 혹은 별다른 관계가 없는지 오른다면 대충 얼마 정도가 오르는지를 알아내어 수익 향상법을 찾아낼 수 있음
FPS 게임에서의 회귀분석 활용 사례
플레이어 행동 예측
회귀 분석을 사용하여 특정 플레이어 행동(예: 이동 패턴, 슈팅 정확도, 명중률 등)을 예측할 수 있습니다. 이를 통해 플레이어의 행동을 이해하고, 게임 디자인 또는 AI 개발에 활용할 수 있습니다.
게임 밸런스 조정
회귀 분석을 사용하여 게임의 밸런스를 평가하고 조정할 수 있습니다. 예를 들어, 특정 무기나 아이템의 사용 빈도와 승률 간의 관계를 조사하여 게임의 균형을 개선하는 데 도움이 될 수 있습니다.
플레이어 리텐션 분석
회귀 분석을 사용하여 특정 이벤트 또는 게임 요소와 플레이어 리텐션 간의 관계를 조사할 수 있습니다. 이를 통해 어떤 요소가 플레이어를 유지하거나 이탈시키는지 이해하고, 이를 개선하는 방안을 모색할 수 있습니다.
매치메이킹 및 승률 예측
회귀 분석을 사용하여 특정 매치 조합이나 팀 구성과 승률 간의 관계를 분석할 수 있습니다. 이를 통해 매치메이킹 시스템을 개선하거나 플레이어에게 더 공평한 경기를 제공할 수 있습니다.
경제 시스템 분석
게임 내 경제 시스템과 관련된 데이터를 회귀 분석하여 아이템 가격 조정이나 경제 균형을 조절하는 데 도움을 줄 수 있습니다.
ACME(Automated Certificate Management Environment)는 SSL/TLS 인증서를 자동으로 발급, 갱신, 폐기할 수 있도록 설계된 프로토콜입니다.
Let's Encrypt에서 처음 개발했지만, 이제는 다른 CA(Certificate Authority, 인증 기관)에서도 지원하고 있어. 대표적으로 Let's Encrypt, ZeroSSL, Buypass 등이 ACME를 사용해서 SSL 인증서를 자동화할 수 있도록 제공합니다.
🔹 ACME의 주요 기능
✅ 인증서 자동 발급 ✅ 도메인 소유권 검증(DNS, HTTP 등) ✅ 자동 갱신 (SSL 인증서가 만료되기 전에 자동으로 갱신 가능) ✅ 인증서 폐기 및 취소 지원
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments, Trainer
from peft import LoraConfig, get_peft_model
from datasets import load_dataset
# 1️⃣ 모델 및 토크나이저 불러오기
model_name = "gpt2"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)
# 2️⃣ LoRA 설정
lora_config = LoraConfig(
r=8, # LoRA 랭크 (낮을수록 연산량 감소)
lora_alpha=16, # LoRA 스케일링 계수
target_modules=["c_attn", "c_proj"], # 적용할 모델의 특정 레이어
lora_dropout=0.1, # 드롭아웃 비율
bias="none",
)
# 3️⃣ LoRA 적용
model = get_peft_model(model, lora_config)
model.print_trainable_parameters() # 학습 가능한 파라미터 확인
# 4️⃣ 데이터셋 로드 및 전처리 (예제: Hugging Face "wikitext" 데이터)
dataset = load_dataset("wikitext", "wikitext-2-raw-v1", split="train")
def tokenize_function(examples):
return tokenizer(examples["text"], padding="max_length", truncation=True)
tokenized_datasets = dataset.map(tokenize_function, batched=True)
tokenized_datasets = tokenized_datasets.shuffle().select(range(1000)) # 데이터 샘플링
# 5️⃣ 학습 설정
training_args = TrainingArguments(
output_dir="./lora-gpt2-model",
evaluation_strategy="epoch",
save_strategy="epoch",
learning_rate=5e-4,
per_device_train_batch_size=8,
per_device_eval_batch_size=8,
num_train_epochs=3,
weight_decay=0.01,
logging_dir="./logs",
)
# 6️⃣ Trainer 객체 생성 및 학습 시작
trainer = Trainer(
model=model,
args=training_args,
train_dataset=tokenized_datasets,
)
trainer.train()
# 7️⃣ LoRA 모델 저장
model.save_pretrained("./lora-gpt2-model")
tokenizer.save_pretrained("./lora-gpt2-model")
print("🎉 LoRA 학습 완료 및 저장 완료!")
🔹 코드 설명
1️⃣ GPT-2 모델과 토크나이저 로드 2️⃣ LoRA 설정
r=8: LoRA 랭크(낮을수록 메모리 사용량 감소)
lora_alpha=16: 학습할 가중치 크기 조정
target_modules=["c_attn", "c_proj"]: LoRA 적용할 Transformer 레이어 선택 3️⃣ LoRA 적용 및 학습 가능한 파라미터 확인 4️⃣ Hugging Face 데이터셋 로드 및 전처리 5️⃣ 훈련 하이퍼파라미터 설정 (Trainer 사용) 6️⃣ 모델 학습 진행 (trainer.train()) 7️⃣ 학습된 모델 저장
🔹 결과 및 활용
✅ 원본 GPT-2 모델을 수정하지 않고 LoRA를 활용해 미세 조정 ✅ 메모리를 절약하면서 특정 도메인(예: 위키텍스트)에 맞춘 GPT-2 생성 모델 학습 가능 ✅ 학습된 LoRA 모델을 저장하고 다시 불러와 사용 가능
🎯 이렇게 하면 LoRA를 사용하여 특정 데이터셋에 최적화된 GPT-2 모델을 만들 수 있습니다! 🚀
from enum import Enum
class Color(Enum):
RED = 1
GREEN = 2
BLUE = 3
print(Color.RED) # Color.RED
print(Color.RED.value) # 1
print(Color.RED.name) # 'RED'
2. 자동 값 할당 (auto)
값을 직접 지정하지 않고 자동으로 할당할 수 있습니다.
from enum import Enum, auto
class Status(Enum):
# auto()는 자동으로 1부터 시작하는 정수 값을 할당합니다.
PENDING = auto()
IN_PROGRESS = auto()
COMPLETED = auto()
print(Status.PENDING.value) # 1
print(Status.IN_PROGRESS.value) # 2
print(Status.COMPLETED.value) # 3
3. 열거형 순회
Enum은 이터러블(iterable)이라서 루프를 돌면서 접근할 수 있습니다.
for color in Color:
print(color.name, color.value)
# 출력
RED 1
GREEN 2
BLUE 3
4. 문자열 매핑 (Enum을 딕셔너리처럼 활용)
열거형을 사용하면 문자열을 특정 값으로 쉽게 변환할 수 있습니다.
class Role(Enum):
ADMIN = "admin"
USER = "user"
GUEST = "guest"
role = Role["ADMIN"] # 문자열 키로 접근
print(role.value) # "admin"
class ExtendedEnum(Enum):
@classmethod
def list(cls):
return [item.name for item in cls]
class Animal(ExtendedEnum):
DOG = 1
CAT = 2
BIRD = 3
print(Animal.list()) # ['DOG', 'CAT', 'BIRD']
8. IntEnum을 활용한 숫자 Enum
IntEnum을 사용하면 숫자 기반 Enum을 다른 정수와 함께 사용할 수 있습니다.
from enum import IntEnum
class Priority(IntEnum):
LOW = 1
MEDIUM = 2
HIGH = 3
print(Priority.LOW < Priority.HIGH) # True
print(Priority.LOW + 1) # 2
9. 플래그(Flag) Enum을 활용한 비트 연산
비트 플래그를 활용할 때 Flag 또는 IntFlag를 사용할 수 있습니다.
비트 연산을 활용하면 권한 시스템을 만들 때 유용합니다.
from enum import Flag, auto
class Permission(Flag):
READ = auto()
WRITE = auto()
EXECUTE = auto()
perm = Permission.READ | Permission.WRITE
print(perm) # Permission.READ|WRITE
# 특정 권한 포함 여부 확인
print(Permission.READ in perm) # True
print(Permission.EXECUTE in perm) # False
[종목명/코드]에 입력된 값을 [검색 구분]의 선택값에 따라 서로 다른 컬럼을 검색하는 쿼리 입니다.
where 절에 case when으로 조건을 지정할 수 있습니다.
select stock_code, stock_name, stock_type, last_collect_event_date
from tbl_coporation_info_kor
where (case when '$search_type' = '종목코드' then stock_code = '$search_code'
else stock_name like '%$search_code%' end)
limit 100;
위 쿼리는 동작은 되지만 실행계획을 보면 stock_code, stock_name에 해당하는 index가 존재하지만 table scan이 발생합니다.
🔹 인덱스를 사용하도록 개선된 코드
select stock_code, stock_name, stock_type, last_collect_event_date
from tbl_coporation_info_kor
where ('$search_type' = '종목코드' and stock_code = '$search_code')
or ('$search_type' = '종목명' and stock_name like '%$search_code%')
limit 100;
SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME
FROM information_schema.SCHEMATA
WHERE SCHEMA_NAME = 'database_name';
✅결과 예시:
3️⃣ 특정 테이블의 문자셋 조회 - 1
show create table tbl_stock_list_us;
✅결과 예시:
CREATE TABLE `tbl_stock_list_us` (
`event_date` date NOT NULL COMMENT '기준일',
`symbol_code` varchar(10) NOT NULL COMMENT '종목 코드',
`last_open_raw` double NOT NULL COMMENT '시가 Raw',
`last_max_raw` double NOT NULL COMMENT '고가 Raw',
`last_min_raw` double NOT NULL COMMENT '저가 Raw',
`last_close_raw` double NOT NULL COMMENT '종가 Raw',
`change_precent_raw` double NOT NULL COMMENT '변동률(퍼센트) Raw',
`volume_raw` double NOT NULL COMMENT '거래량',
`upd_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`event_date`,`symbol_code`),
UNIQUE KEY `idx_01` (`symbol_code`,`event_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
3️⃣ 특정 테이블의 문자셋 조회 - 2
SELECT TABLE_NAME, TABLE_COLLATION
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'db_stock' AND TABLE_NAME = 'tbl_stock_list_us';
✅결과 예시:
4️⃣ 특정 열(Column)의 문자셋 조회
SELECT COLUMN_NAME, CHARACTER_SET_NAME, COLLATION_NAME
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'db_stock' AND TABLE_NAME = 'tbl_stock_list_us';