본문 바로가기

인공지능/LLM

LLama.cpp 설치하고 실행해보기

728x90
반응형

LLama.cpp 설치하고 실행해보기

Huggingface 최신 모델인 Upstage의 SOLAR를 llama.cpp를 사용하여 실행하는 방법에 대해 알아보겠습니다. 이 예제에서 사용된 SOLAR-10.7B 모델은 107억 개의 매개변수를 가진 강력한 언어 모델로, 자연어 처리(NLP)에서 탁월한 성능을 자랑합니다. 기존의 대형 모델들과 비교하여도 뛰어난 성능을 보이며, 간단한 미세 조정을 통해 이를 더욱 향상시킬 수 있습니다.

이 튜토리얼은 WSL2에서 Ubuntu 22.04와 Python 3.10.12 환경에서 테스트되었습니다. 사전에 transformer 와 huggingface-cli 가 설치되어있음을 가정합니다.

llama.cpp 설치하기

llama.cpp 소스 코드 다운로드 및 빌드

먼저, llama.cpp의 소스 코드를 다운로드하고 빌드하는 과정을 설명합니다. 아래의 명령어들을 순서대로 실행하여 소스 코드를 다운로드하고 빌드해주세요.

$ git clone https://github.com/ggerganov/llama.cpp.git
$ cd llama.cpp
$ make LLAMA_OPENBLAS=1

make LLAMA_OPENBLAS=1 명령어는 llama.cpp 프로젝트를 빌드할 때 OpenBLAS 라이브러리를 사용하도록 설정합니다. 이렇게 설정함으로써, llama.cpp 내부에서 수행되는 수학적 연산이 OpenBLAS를 통해 최적화되어 더 빠른 성능을 기대할 수 있습니다. OpenBLAS를 사용함으로써, 특히 대규모 데이터셋을 다룰 때 더 높은 처리 속도와 효율성을 얻을 수 있습니다.

llama.cpp 설치 확인

빌드가 성공적으로 완료되면 main이라는 실행 파일이 생성됩니다. 다음과 같이 파일을 확인할 수 있습니다:

$ ll main
-rwxr-xr-x 1 makepluscode makepluscode 1421808 Jan 13 23:07 main*

Huggingface 모델 다운로드

다음으로, 모델을 다운로드해야 합니다. 이 예제에서 사용된 SOLAR-10.7B 모델은 107억 개의 매개변수를 가진 언어 모델 입니다. 아래 huggingface-cli 명령어를 실행하여 모델을 다운로드하세요.

$ huggingface-cli download upstage/SOLAR-10.7B-v1.0 --local-dir=./SOLAR-10.7B-v1.0

Huggingface 모델 변환

모델을 다운로드한 후에는 모델 변환 과정이 필요합니다. 아래 명령어들을 통해 모델을 변환할 수 있습니다.

$ python3 convert.py models/SOLAR-10.7B-v1.0/

모델크기가 크기 때문에 quantization 의 옵션은 q4_1 로 지정하고 양자화를 수행합니다.

$ ./quantize ./models/SOLAR-10.7B-v1.0/ggml-model-f16.gguf ./models/SOLAR-10.7B-v1.0/ggml-model-q4_1.gguf q4_1

이 과정을 거치면 아래와 같이 약 20G 모델이 6.3G 로 축소 된 것을 알수 있습니다. (FP16 에서 int4 로 약 4배 축소됨)

$ ls -alh ggml-model-*
-rw-r--r-- 1 makepluscode makepluscode  20G Jan 13 23:14 ggml-model-f16.gguf
-rw-r--r-- 1 makepluscode makepluscode 6.3G Jan 13 23:18 ggml-model-q4_1.gguf

4. 모델 실행 및 테스트

마지막으로 모델을 실행하여 테스트해보겠습니다. 아래의 명령어를 통해 모델을 실행할 수 있습니다:

$ ./main -m ./models/SOLAR-10.7B-v1.0/ggml-model-q4_1.gguf -n 128 --prompt "let me know about 12 olympians and greek gods. what is the beginning story?"

명령어를 통해 나온 전체 로그와 실행 결과 입니다.

$ ./main -m ./models/SOLAR-10.7B-v1.0/ggml-model-q4_1.gguf -n 128 --prompt "let me know about 12 olympians and greek gods. what is the beginning story?"
Log start
main: build = 1849 (15ebe59)
main: built with cc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0 for x86_64-linux-gnu
main: seed  = 1705190177
llama_model_loader: loaded meta data with 22 key-value pairs and 435 tensors from ./models/SOLAR-10.7B-v1.0/ggml-model-q4_1.gguf (version GGUF V3 (latest))
llama_model_loader: Dumping metadata keys/values. Note: KV overrides do not apply in this output.
llama_model_loader: - kv   0:                       general.architecture str              = llama
llama_model_loader: - kv   1:                               general.name str              = LLaMA v2
llama_model_loader: - kv   2:                       llama.context_length u32              = 4096
llama_model_loader: - kv   3:                     llama.embedding_length u32              = 4096
llama_model_loader: - kv   4:                          llama.block_count u32              = 48
llama_model_loader: - kv   5:                  llama.feed_forward_length u32              = 14336
llama_model_loader: - kv   6:                 llama.rope.dimension_count u32              = 128
llama_model_loader: - kv   7:                 llama.attention.head_count u32              = 32
llama_model_loader: - kv   8:              llama.attention.head_count_kv u32              = 8
llama_model_loader: - kv   9:     llama.attention.layer_norm_rms_epsilon f32              = 0.000010
llama_model_loader: - kv  10:                       llama.rope.freq_base f32              = 10000.000000
llama_model_loader: - kv  11:                          general.file_type u32              = 3
llama_model_loader: - kv  12:                       tokenizer.ggml.model str              = llama
llama_model_loader: - kv  13:                      tokenizer.ggml.tokens arr[str,32000]   = ["<unk>", "<s>", "</s>", "<0x00>", "<...
llama_model_loader: - kv  14:                      tokenizer.ggml.scores arr[f32,32000]   = [0.000000, 0.000000, 0.000000, 0.0000...
llama_model_loader: - kv  15:                  tokenizer.ggml.token_type arr[i32,32000]   = [2, 3, 3, 6, 6, 6, 6, 6, 6, 6, 6, 6, ...
llama_model_loader: - kv  16:                tokenizer.ggml.bos_token_id u32              = 1
llama_model_loader: - kv  17:                tokenizer.ggml.eos_token_id u32              = 2
llama_model_loader: - kv  18:            tokenizer.ggml.unknown_token_id u32              = 0
llama_model_loader: - kv  19:               tokenizer.ggml.add_bos_token bool             = true
llama_model_loader: - kv  20:               tokenizer.ggml.add_eos_token bool             = false
llama_model_loader: - kv  21:               general.quantization_version u32              = 2
llama_model_loader: - type  f32:   97 tensors
llama_model_loader: - type q4_1:  337 tensors
llama_model_loader: - type q6_K:    1 tensors
llm_load_vocab: special tokens definition check successful ( 259/32000 ).
llm_load_print_meta: format           = GGUF V3 (latest)
llm_load_print_meta: arch             = llama
llm_load_print_meta: vocab type       = SPM
llm_load_print_meta: n_vocab          = 32000
llm_load_print_meta: n_merges         = 0
llm_load_print_meta: n_ctx_train      = 4096
llm_load_print_meta: n_embd           = 4096
llm_load_print_meta: n_head           = 32
llm_load_print_meta: n_head_kv        = 8
llm_load_print_meta: n_layer          = 48
llm_load_print_meta: n_rot            = 128
llm_load_print_meta: n_embd_head_k    = 128
llm_load_print_meta: n_embd_head_v    = 128
llm_load_print_meta: n_gqa            = 4
llm_load_print_meta: n_embd_k_gqa     = 1024
llm_load_print_meta: n_embd_v_gqa     = 1024
llm_load_print_meta: f_norm_eps       = 0.0e+00
llm_load_print_meta: f_norm_rms_eps   = 1.0e-05
llm_load_print_meta: f_clamp_kqv      = 0.0e+00
llm_load_print_meta: f_max_alibi_bias = 0.0e+00
llm_load_print_meta: n_ff             = 14336
llm_load_print_meta: n_expert         = 0
llm_load_print_meta: n_expert_used    = 0
llm_load_print_meta: rope scaling     = linear
llm_load_print_meta: freq_base_train  = 10000.0
llm_load_print_meta: freq_scale_train = 1
llm_load_print_meta: n_yarn_orig_ctx  = 4096
llm_load_print_meta: rope_finetuned   = unknown
llm_load_print_meta: model type       = 34B
llm_load_print_meta: model ftype      = Q4_1
llm_load_print_meta: model params     = 10.73 B
llm_load_print_meta: model size       = 6.27 GiB (5.02 BPW)
llm_load_print_meta: general.name     = LLaMA v2
llm_load_print_meta: BOS token        = 1 '<s>'
llm_load_print_meta: EOS token        = 2 '</s>'
llm_load_print_meta: UNK token        = 0 '<unk>'
llm_load_print_meta: LF token         = 13 '<0x0A>'
llm_load_tensors: ggml ctx size =    0.17 MiB
llm_load_tensors: offloading 0 repeating layers to GPU
llm_load_tensors: offloaded 0/49 layers to GPU
llm_load_tensors:        CPU buffer size =  6422.18 MiB
...................................................................................................
llama_new_context_with_model: n_ctx      = 512
llama_new_context_with_model: freq_base  = 10000.0
llama_new_context_with_model: freq_scale = 1
llama_kv_cache_init:        CPU KV buffer size =    96.00 MiB
llama_new_context_with_model: KV self size  =   96.00 MiB, K (f16):   48.00 MiB, V (f16):   48.00 MiB
llama_new_context_with_model: graph splits (measure): 1
llama_new_context_with_model:        CPU compute buffer size =    73.00 MiB

system_info: n_threads = 8 / 16 | AVX = 1 | AVX_VNNI = 0 | AVX2 = 1 | AVX512 = 0 | AVX512_VBMI = 0 | AVX512_VNNI = 0 | FMA = 1 | NEON = 0 | ARM_FMA = 0 | F16C = 1 | FP16_VA = 0 | WASM_SIMD = 0 | BLAS = 0 | SSE3 = 1 | SSSE3 = 1 | VSX = 0 |
sampling:
        repeat_last_n = 64, repeat_penalty = 1.100, frequency_penalty = 0.000, presence_penalty = 0.000
        top_k = 40, tfs_z = 1.000, top_p = 0.950, min_p = 0.050, typical_p = 1.000, temp = 0.800
        mirostat = 0, mirostat_lr = 0.100, mirostat_ent = 5.000
sampling order:
CFG -> Penalties -> top_k -> tfs_z -> typical_p -> top_p -> min_p -> temp
generate: n_ctx = 512, n_batch = 512, n_predict = 128, n_keep = 0


 let me know about 12 olympians and greek gods. what is the beginning story?
What happened to Zeus after he was found by his mother on Mount Ida?
Did Poseidon have a wife?
How did Zeus defeat his father, Cronus?
Who gave birth to Zeus's twins, Athena and Apollo?
Why do the Muses make their home in Mt. Olympus?
What happened when Hephaestus fell from Mount Olympus?
How did Eros help Aphrodite escape from Ares?
Who was Zeus's father?
Did Poseidon have any children?
Which
llama_print_timings:        load time =     380.86 ms
llama_print_timings:      sample time =      17.95 ms /   128 runs   (    0.14 ms per token,  7131.32 tokens per second)
llama_print_timings: prompt eval time =    1916.96 ms /    21 tokens (   91.28 ms per token,    10.95 tokens per second)
llama_print_timings:        eval time =   30995.58 ms /   127 runs   (  244.06 ms per token,     4.10 tokens per second)
llama_print_timings:       total time =   32969.44 ms /   148 tokens
Log end

실행 후, 다양한 질문들에 대한 모델의 응답을 확인할 수 있습니다. 이러한 응답은 모델이 얼마나 잘 학습되었는지를 보여주는 좋은 지표가 됩니다.

반응형

'인공지능 > LLM' 카테고리의 다른 글

GPT 구조에 대한 초간단 리뷰  (0) 2024.02.09
Whisper large v3 모델 실행하기  (0) 2024.01.20
LLM 학습과정에서 RLHF 란?  (0) 2024.01.18
LLM 의 기본 구조와 모델  (0) 2024.01.18