2024년 3월 30일 토요일
몬테카를로 시뮬레이션 기반 주가 예측
2024년 3월 22일 금요일
무료 LiDAR 포인트 클라우드 다운로드 웹사이트 소개
2024년 3월 21일 목요일
허깅페이스 트랜스포머 라이브러리 사용법 총정리
- 자연어처리: 텍스트 분류, 엔티티 인식, 질문 및 답변, 언어 모델링, 요약, 번역, 객관식 및 주관식 텍스트 생성
- 컴퓨터 비전: 이미지 분류, 객체 인식 및 세그먼테이션
- 오디오: 자동 음성 인식 및 분류
- 멀티모달: 표 해석 질문, OCR, 스캔 문서에서 정보 추출, 비디오 분류, 시각적 질문
- 사전 학습모델, 훈련 데이터셋 무료 다운로드 및 파인튜닝(Fine-tune a pretrained model, Fine-Tuning BERT using Hugging Face Transformers, How to Fine-Tune BERT for NER Using HuggingFace, Fine-Tuning the Pre-Trained bert-base-NER in Hugging Face for Named Entity Recognition (NER))
계층 | 대표 클래스명 명명 규칙 | 목적 (Task) | 주요 출력물 (Outputs) | 사용 사례 |
Level 0 (Root) | PreTrainedModel | 모든 모델의 공통 기능 제공 (가중치 로드, 저장, 설정 관리) | 없음 (추상 베이스) | 모든 모델의 기본 뼈대 |
Level 1 (Base) | {Model}Model (예: BertModel, Qwen2Model) | 특징 추출 (Backbone). 문맥을 이해하여 고차원 벡터로 변환 | last_hidden_state (토큰별 임베딩 벡터) | 문장 유사도 비교, 커스텀 모델 제작 |
Level 2 (Head) | {Model}For{Task} (예: BertForSequenceClassification) | 특정 작업 수행. 베이스 모델 위에 한 층의 레이어(Head) 추가 | loss, logits (결과 점수 및 손실) | 실제 서비스 적용 (분류, 생성, 추출 등) |
AutoModel 클래스명 | 목적 (Task) | 주요 출력물 (Outputs) | 사용 사례 |
AutoModel | 특징 추출 전용 (Level 1 로드) | last_hidden_state | 텍스트를 벡터로 변환하여 DB 저장 |
AutoModelForCausalLM | 문장 생성 (LLM 핵심) | logits (다음 단어 확률) | 챗봇, 소설 쓰기, 코드 생성 |
AutoModelForSequenceClassification | 문장 단위 분류 | logits (클래스별 점수) | 감정 분석, 스팸 판정, 대화 의도 파악 |
AutoModelForTokenClassification | 단어(토큰) 단위 분류 | logits (단어별 태그) | 개체명 인식(NER), 품사 태깅 |
AutoModelForVision2Seq | 이미지 기반 설명 (VLM) | logits (이미지 설명 텍스트) | 이미지 캡셔닝, 시각적 질의응답(VQA) |
AutoModelForQuestionAnswering | 지문 내 정답 찾기 | start_logits, end_logits | 독해 문제 풀이, 매뉴얼 내 정보 검색 |
- Question answering (huggingface.co)
- Agents & Tools (huggingface.co)
- Fine-tune a pretrained model (huggingface.co)
- Fine-Tuning BERT using Hugging Face Transformers (learnopencv.com)
- How to Fine-Tune BERT for NER Using HuggingFace (freecodecamp.org)
- Fine-Tuning the Pre-Trained bert-base-NER in Hugging Face for Named Entity Recognition (NER) | by Yuan An, PhD | Medium
- medium/src/working_huggingface/Working_with_HuggingFace_ch2_Preparing_Dataset_for_Fine_Tuning_NER_Model.ipynb at main · anyuanay/medium (github.com)
- pankajmathur/orca_mini_v2_7b · Hugging Face
- RunPod GPU Cloud
2024년 3월 16일 토요일
GPU 없는 로컬에서 서비스 가능한 경량 소형 LLM, LLAMA2.c, llama.cpp 빌드, 실행, 학습 및 코드 분석하기
./run stories15M.bin
- token_embedding_table: 토큰 임베딩 테이블을 나타낸다. 이는 어휘 크기(vocab_size)와 차원(dim)의 2차원 배열이다.
- rms_att_weight, rms_ffn_weight: RMSNorm의 가중치를 나타낸다. 각각 attention과 feed-forward network에 대한 것이다.
- wq, wk, wv, wo: 각각 query, key, value, output에 대한 가중치를 나타낸다. 이들은 multi-head attention에서 사용된다.
- w1, w2, w3: feed-forward network에서 사용되는 가중치이다.
- rms_final_weight: 최종 RMSNorm의 가중치를 나타낸다.
- wcls: (선택적으로) 마지막 레이어에서 로짓에 대한 분류기 가중치를 나타낸다.
- 이 구조체는 Transformer 모델의 가중치를 저장하고 관리하는 데 사용된다.
1. 이 코드는 트랜스포머 모델의 구성, 가중치 및 상태에 대한 구조와 메모리 할당, 메모리 해제 및 체크포인트 읽기 기능을 정의한다.2. 'rmsnorm', 'softmax', 'matmul'과 같은 신경망 블록을 위한 함수도 포함되어 있다.3. 코드는 Transformer 모델을 통해 입력 토큰을 처리하여 출력 로짓을 생성하는 'forward' 함수를 구현한다.4. 또한 BPE(Byte Pair Encoding) 토크나이저가 문자열을 토큰으로 또는 그 반대로 변환하는 구조와 함수가 있다.5. 코드에는 argmax, 샘플링 및 top-p 샘플링과 같은 다양한 전략을 사용하여 확률을 기반으로 토큰을 샘플링하는 '샘플러' 구조와 함수가 포함된다.6. 시간 측정을 위한 유틸리티 기능과 Transformer 모델을 기반으로 텍스트를 생성하는 '생성' 기능을 정의한다.7. 마지막으로 트랜스포머 모델을 사용하여 사용자와 어시스턴트 간의 대화를 시뮬레이션하는 '채팅' 기능을 정의한다.
이를 본인의 목적에 맞게 적절히 데이터를 준비한 후, 다음과 같이 동일한 방식으로 학습하면 가중치 벡터가 저장된 bin파일을 얻을 수 있다. 이를 이용해, 앞서 언급된 방식과 동일하게 사용하면 된다.
CMake를 사용하여 `build` 폴더를 성공적으로 구성(Configure)하셨다면, 이제 실제로 코드를 컴파일하고 실행 파일(.exe)을 생성하는 빌드(Build) 단계를 진행해야 한다. `cmake -B build` 명령어는 "설정(Configure)"만 한 것이고, 실제 빌드는 다음 명령어로 수행한다.
`--build build`: 아까 생성한 `build` 디렉토리를 타겟으로 빌드를 수행한다.`--config Release`: 성능 최적화를 위해 반드시 Release 모드로 빌드해야 한다. (이 옵션을 안 주면 기본값인 Debug 모드로 빌드되어 실행 속도가 매우 느리다.)
Qwen/Qwen2.5-7B-Instruct-GGUF(https://huggingface.co/Qwen/Qwen2.5-7B-Instruct-GGUF) 접속'q4_k_m.gguf' 같은 파일을 다운로드하여 'F:\projects\tools\llama.cpp\models' 폴더(없으면 생성)에 저장
.\build\bin\Release\llama-cli.exe -m F:\projects\tools\llama.cpp\models\qwen2.5-7b-instruct-q3_k_m.gguf -ngl 99 -c 2048 -p "안녕? 자기소개 해줘."
'-m': 모델 파일 경로'-ngl 99': 모든 레이어를 GPU(CUDA)에 할당합니다. (GPU 메모리가 부족하다면 숫자를 30, 50 등으로 낮추세요.)'-c 2048': 컨텍스트 윈도우 크기입니다.'-p': 프롬프트 내용입니다.
1. CUDA 로그 확인: 실행 직후 로그에 'ggml_cuda_init: GGML_CUDA_DLL_PATH = ...', 'GGML_CUDA: Found 1 CUDA devices'와 같은 메시지가 뜨는지 확인. 이게 떠야 GPU를 쓰고 있는 것.2. 성능 확인: 'eval time' 및 'sample time' 항목에서 'tokens per second' 수치를 확인. CPU만 사용할 때보다 훨씬 빠른 속도가 나와야 정상.3. 메모리 확인: 모델이 로딩될 때 작업 관리자의 GPU 메모리(VRAM) 점유율이 올라가는지 확인.
.\build\bin\Release\llama-server.exe -m F:\projects\tools\llama.cpp\models\qwen2.5-7b-instruct-q3_k_m.gguf -ngl 99 --port 8080 --host 0.0.0.0'-ngl 99': 모델을 최대한 GPU VRAM에 로딩.'--port 8080': 서버가 실행될 포트.'--host 0.0.0.0': 외부 접속을 허용 (로컬에서만 쓸 거면 생략 가능).
llama_model_load: ......HTTP server listening at 0.0.0.0:8080
from openai import OpenAI# 서버가 8080 포트에서 실행 중일 때client = OpenAI(base_url="http://localhost:8080/v1",api_key="not-needed" # 로컬이므로 아무 값이나 입력)response = client.chat.completions.create(model="Qwen2.5",messages=[{"role": "user", "content": "Qwen 2.5 모델에 대해 설명해줘."}])print(response.choices[0].message.content)
- GPU 사용 확인: 서버가 실행되는 동안 터미널 로그를 보면 '[llama.cpp] ... CUDA ...' 같은 문구가 보일 것이다. 만약 속도가 매우 느리다면 모델 전체가 VRAM에 로드되지 않은 것이니, '--gpu-layers' (또는 '-ngl') 설정을 다시 확인한다.
- 메모리 관리: 서버는 모델을 메모리에 계속 올려두고 대기한다. 모델 사용이 끝나면 터미널에서 'Ctrl + C'를 눌러 서버를 확실히 종료하여 GPU VRAM을 회수하라.
- 컨텍스트 최적화: 서버 구동 시 '-c 4096' 또는 '-c 8192' 옵션을 추가하여 컨텍스트 윈도우를 조정할 수 있다 (모델의 최대 지원 길이에 맞춰 설정).
- LLAMA2.c, https://github.com/karpathy/llama2.c
- How to train llama2.c with Google Colab
- Code to Flow
- Llama2.c on PC with 8GB RAM, No GPU, No Container - pretokenization, training and inference - Technically Impossible (hatenablog.jp)
- efocht/ve-llama2.c-bins at main (huggingface.co)
- karpathy/llama2.c: Inference Llama 2 in one file of pure C (github.com)
- How to Run Llama 2 Locally: A Guide to Running Your Own ChatGPT like Large Language Model (sych.io)
- How to use Ollama in Python | No GPU required for any LLM | LangChain | LLaMa (youtube.com)
- llama.cpp 전체 가이드 2026
