머신러닝AI2023. 6. 6. 22:48

 이 글은 llama.cpp 프로젝트에 대한 소개다. 이 프로젝트는 기본적으로 맥북에서 LLAMA를 돌리는 것이 목표였는데, 다행스럽게도 linux x86에서 충분한 메모리만 있어도 LLAMA의 대형 모델을 구동할 수 있다.

 

 GPU 메모리가 아닌 일반 메모리에서도 LLAMA를 탑재해 구동할 수 있는 것이다! 설명은 우선 ubuntu linux(20.04이지만 상위 버전에서도 잘 되리라 본다) 를 중심으로 해본다. 어렵지 않게 따라가볼 수 있다. 애플 맥북에서도 아래 가이드에 따라 적당하게 골라서 컴파일하면 실행할 수 있다.

 

https://github.com/ggerganov/llama.cpp

 

GitHub - ggerganov/llama.cpp: Port of Facebook's LLaMA model in C/C++

Port of Facebook's LLaMA model in C/C++. Contribute to ggerganov/llama.cpp development by creating an account on GitHub.

github.com

 

1) 우선 컴파일을 하자.

 

1.1) CPU만으로 구동

 

$ git clone https://github.com/ggerganov/llama.cpp

$ cd llama.cpp

$ make

$ ./main

main: build = 626 (2d43387)
main: seed  = 1686058067
..

 

라고 나오면 정상이다.

 

1.2) GPU 가속의 도움을 얻도록 구동(GPU보유자만)

 

혹시 GPU가 있다면 cuBLAS를 통해 GPU가속기능을 쓸 수 있다고 되어 있다. 이 경우에는 cmake를 통해 컴파일해보자. 사실 단순히 구동에 있어서는 필요 없으므로 건너뛰어도 무방하다.

 

# /work/llama.cpp디렉토리에 설치한다고 가정했다

 

$ cd /work

$ git clone https://github.com/ggerganov/llama.cpp
$ cd llama.cpp

$ mkdir build

$ cd build

$ cmake .. -DLLAMA_CUBLAS=ON

$ cmake --build . --config Release

$ cd bin

$ ./main

..

라고 나오면 정상이다.

 

2) LLAMA 모델을 다운로드 받자.

 

이것은 받아둔 사람이 있다면 넘어가면 되고, 받지 않는 사람은 아래 방법으로 받자. 대형 모델은 시간이 좀 오래 걸릴 수도 있다. 아래 LLAMA 모델의 사이즈를 참고하자.

 

Model Original Size Quantized Size(4bit)
7B 13 GB 3.9 GB
13B 24 GB 7.8 GB
30B 60 GB 19.5 GB
65B 120 GB 38.5 GB

 

# /work/llama_data에 모델을 다운로드 받는다고 가정하자. 다른곳에 저장해도 좋다.

 

 $ cd /work

 $ mkdir llama_data

 $ git clone https://github.com/juncongmoo/pyllama

 $ cd pyllama

 $ pip install pyllama -U

 $ pip install -r requirements.txt    #이 설치가 pyllama설치만으로도 처리되어, 필요했는지 불명확한데 일단 실행하자

#필요한용량을 아래 선택해서 받는다

 $ python -m llama.download --model_size 7B --folder ../llama_data

 $ python -m llama.download --model_size 13B --folder ../llama_data

 $ python -m llama.download --model_size 30B --folder ../llama_data

 

3) 이제 llama.cpp를 실행해보자.

 

여기서는 7B 모델을 실행했지만, 다운받은 모델에 맞춰 7B라는 이름만 바꿔서 실행하면 된다.

 

 $ cd /work/llama.cpp

 $ python -m pip install -r requirements.txt

 $ python convert.py ../llama_data/7B/

 $ ./quantize ../llama_data/7B/ggml-model-f16.bin ../llama_data/7B/ggml-model-q4_0.bin q4_0

 $ ./main -m ../llama_data/7B/ggml-model-q4_0.bin -n 128

main: build = 626 (2d43387)
main: seed  = 1686058857
llama.cpp: loading model from ../../../llama_data/7B/ggml-model-q4_0.bin
llama_model_load_internal: format     = ggjt v3 (latest)
llama_model_load_internal: n_vocab    = 32000
llama_model_load_internal: n_ctx      = 512
llama_model_load_internal: n_embd     = 4096
llama_model_load_internal: n_mult     = 256
llama_model_load_internal: n_head     = 32
llama_model_load_internal: n_layer    = 32
llama_model_load_internal: n_rot      = 128
llama_model_load_internal: ftype      = 2 (mostly Q4_0)
llama_model_load_internal: n_ff       = 11008
llama_model_load_internal: n_parts    = 1
llama_model_load_internal: model size = 7B
llama_model_load_internal: ggml ctx size =    0.07 MB
llama_model_load_internal: using CUDA for GPU acceleration
llama_model_load_internal: mem required  = 5407.71 MB (+ 1026.00 MB per state)
llama_model_load_internal: offloading 0 layers to GPU
llama_model_load_internal: total VRAM used: 0 MB
.
llama_init_from_file: kv self size  =  256.00 MB

system_info: n_threads = 4 / 8 | AVX = 1 | 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 = 1 | SSE3 = 1 | VSX = 0 | 
sampling: repeat_last_n = 64, repeat_penalty = 1.100000, presence_penalty = 0.000000, frequency_penalty = 0.000000, top_k = 40, tfs_z = 1.000000, top_p = 0.950000, typical_p = 1.000000, temp = 0.800000, mirostat = 0, mirostat_lr = 0.100000, mirostat_ent = 5.000000
generate: n_ctx = 512, n_batch = 512, n_predict = 128, n_keep = 0


 1960: The Beatles at Blackpool
1960 was an eventful year for the Beatles. John Lennon's father, a merchant seaman, died in January and his mother was admitted to hospital after suffering a nervous breakdown. As a result of these family crises they had to give up their studies at college and work full-time ..

 

#interactive한 대화도 가능하다

 $ ./main -m ../llama_data/7B/ggml-model-q4_0.bin -n 256 --repeat_penalty 1.0 --color -i -r "User:" -f prompts/chat-with-bob.txt

 

속도는 느리지만, 일반 linux PC에서도 잘 작동하는 것을 알 수 있다.(30B정도 모델이 되면 답답하게 느려짐을 체감할 수 있긴 하다)

 

4) 맥북 M1, M2 유저라면 맥북의 GPU 가속 기능을 쓸 수도 있다.

 

M1, M2 챕 맥북을 가진 유저라면 상기 make시에 Metal로 컴파일하여 빠른 속도를 체감해보면 더 좋겠다. 상세내용은 llama.cpp github을 참조하자.

 

$ LLAM_METAL=1 make

 

5) 다른 종류의 chat 모델도 시험해볼까?

LLAMA의 다양한 quantized 모델이 huggingface에 등록되어 있다. 예를 들면 TheBloke의 아래 모델을 보자.

 

https://huggingface.co/TheBloke/Llama-2-13B-chat-GGML 

 

TheBloke/Llama-2-13B-chat-GGML · Hugging Face

Inference API has been turned off for this model.

huggingface.co

 

여기서 llama-2-13b-chat.ggmlv3.q4_0.bin 라는 chat 모델을 다운로드 받으면 아래와 같이 실험해볼 수 있다.

 

$ ./main -m llama-2-13b-chat.ggmlv3.q4_0.bin -n 256 --repeat_penalty 1.0 --color -i -r "User:" --prompt "could you generate python code for generating prime numbers?"

 

.... 여러가지 CPU에서는 느리지만 잘 나온다는 것을 알 수 있다.

 

반응형
Posted by 작동미학
머신러닝AI2023. 6. 6. 19:58

 ChatGPT같은 LLM을 구동하기 위해서는 대부분 A100같은 80GB의 메모리 GPU 여러장을 필요로 한다. 다른 머신러닝 연산과도 다른 것이 그 커다란 언어모델을 GPU에 적재하고 처리하기 때문에 특히 GPU 메모리가 많이 필요하다.

 

 따라서 이런 LLM을 직접 하기 위해서는 클라우드를 사용하게 되는데, 집에서 간단히 해볼 수는 없을까? 언어모델들 크기도 줄어든다는데 일정수준을 해보고 싶자면 어떤 GPU를 택하면 좋을지 고민이 된다. 그래서 이럴때 GPU를 선택하는 법을 간단히 적어보자. 우선 아래 각 RTX 모델별 메모리나 소비 전력을 살펴보자.

 

모델명(NVIDIA RTX) 최대메모리(GB) 방식/선폭 소비전력(W)
3060 8 GA107/8nm 200
3070 8 GA104/8nm 220
3080 12 GA102/8nm 350
3090 24 GA102/8nm 350
4060 8 AD107/4nm 115
4060ti 16 AD106/4nm 160
4070 12 AD104/4nm 200
4080 16 AD103/4nm 320
4090 24 AD102/4nm 450

 

 LLM을 다양하게 구동하다보면 늘 어려운 것은 GPU 메모리 용량 확보이다. 속도는 둘째 문제이고 사실 그렇게 몇배까지 차이가 나지 않는다. LLAMA 7B모델을 돌려라도 보려면 모델만 13GB정도를 GPU메모리에 올려야 하니 일단 RTX xx60시리즈는 난감하게 된다. 심지어 용량을 축소하는 quantized 코드(소수점 정확도를 줄여서 용량을 늘리는 기술이다)들도 메모리를 많이 쓰기 때문에 그때도 막히는 경우가 있다. 여하튼 메모리가 커야한다.

 

 그래서 가정용으로 취할 수 있는 선택은 우선 GPU 메모리 16GB인 4060ti, 4080이 있다. 가격면이나 소비전력 면에서는 4060ti와 4080이 16G관점에서 후보가 된다. 그리고 그 다음은 24GB인 3090, 4090이 있다. 다만 4090은 너무 고가이기 때문에, 대략 4060ti, 4080, 3090정도가 가정용으로 선택할 수 있는 합리적인 선택이어 보인다.

 

 그리고 또하나 고용량 GPU를 처음 구비하는 사람이 놓칠 수 있는 것은 이 소비 전력이다. 4080(320W)급의 GPU도 권장 PC파워서플라이어 용량이 800W 정도를 거론한다. 원래 파워가 표기 용량보다 좀 적은 부분도 있고, 다른 주변기기들 때문에 PC가 그 정도의 총 전력을 소모하리라 보는 것이다. 특히 GPU의 발열 때문에 팬이 빠르게 많이 돌면 상대적으로 소비 전력이 올라갈 수 있다. 집에 전력 측정기(power meter)같은 것이 있어서 PC의 통상 전력을 알 수 있다면 거기에 약간의 보험을 더해서 파워를 준비해둘 필요가 있다. 본인의 경우에는 통상 GPU미사용시 150W를 넘은 적이 없으므로 상기 GPU소모량의 120%를 더해서 파워를 갖추어도 문제는 없었다. 파워가 부족하면 PC가 예고없이 다운될 수도 있으므로 그래도 조심할 필요가 있다.  그리고 이와 더불어 이 GPU를 제대로 구동할 수 있는 PC 스펙에 대해서는 아래와 같인 고민이 필요하다.

 

https://infoengineer.tistory.com/109

 

Meta LLAMA를 잘 돌리기 위한 데스크탑 PC 업그레이드

LLM을 돌리다보니 집의 데스크탑을 계속 개선하고 있는 나를 바라보면서 쌓인 지식들을 정리해두면 어떨까 싶어 기록해둔다. LLM이 돌아가려면 고용량 메모리, 고속의 CPU, 고속의 저장장치, 고속

infoengineer.tistory.com

 

 서버급을 참고삼아 살펴보면, 이제 A40, A100같은 선택들이 존재한다. 다만 이 녀석들은 모두 지나치게 고가이고 소비 전력도 더 크기 때문에 그다지 가정용으로 하기는 쉽지 않을테다. GPU가 부담스럽다면 최근의 llama.cpp 프로젝트를 참고해보는 것도 좋다. 메인보드 메모리만으로도 우선 LLAMA를 돌려볼 수는 있다. 다만 고용량 모델로 갈수록 병렬 부동소수점 연산이 GPU에 뒤쳐질테니 더 느려지는 것은 어쩔 수 없을 수 있다. 그래도 quantize할때 등 사용할 수 있고, M1/M2칩 탑재한 애플 맥북에서는 꽤 속도도 빠르다고 알려져 있다. 이 부분은 아래를 참조하자.

 

https://infoengineer.tistory.com/107

 

Meta LLAMA를 GPU없이 CPU 메모리에서 돌려보자

이 글은 llama.cpp 프로젝트에 대한 소개다. 이 프로젝트는 기본적으로 맥북에서 LLAMA를 돌리는 것이 목표였는데, 다행스럽게도 linux x86에서 충분한 메모리만 있어도 LLAMA의 대형 모델을 구동할 수

infoengineer.tistory.com

 

반응형
Posted by 작동미학
머신러닝AI2023. 5. 20. 15:44

최근에 일리야 서츠케버(Ilya Sutskever, OpenAI의 수석과학자)와 젠슨 황(Jenson Hwang, Nvidia CEO)의 대담이 유투브에 올라왔다. 개인적으로는 OpenAI의 ChatGPT가 함의하는 바를 그 분야를 가장 앞에서 다루는 사람이 설명하고 있다고 생각해 그에 대한 글을 써보려고 한다.

 

https://www.youtube.com/watch?v=LQviQS24uQY 

 

일리야 서츠케버는 힌튼 교수의 제자이며 딥러닝의 문을 열었다고 평가되는 이미지 인식 모델인 AlexNet을 같이 연구한 전산학도이고, 이후 OpenAI의 초기 창업자로 합류한 인물이다. 이 대담에서는 그런 그의 첫번째 깨달음이 나온다.

 

 신경망이 충분히 깊고 크다면 어려운 문제를 풀 수 있을거라는 것이라는 믿음으로 AlexNet을 연구한 결과이다. 여러가지 딥러닝 기술로 신경망 학습의 제약이 많이 줄어든 상태에서, GPU를 사용해 연산 속도를 극적으로 높이고, 당시에 아무도 시도하지 않았던, 큰 크기의 신경망을 통해 이미지 인식 분야에서 오차를 크게 줄인 일이다. 그 일로 서츠케버는 큰 규모의 신경망에 대한 일종의 믿음이 생겼다고 한다. 모두 작은 크기의 신경망만 다루던 그 시절에서 크기를 키웠을 때의 성능 개선이 가능하다는 사실을 큰 성공을 통해 깨달은 것이다.

 

 그 다음으로는 강화학습의 중요성이다. 딥마인드의 알파스타같이 지속 여러가지 피드백을 실시간으로 받아가며 학습하는 방법에 대한 연구이다. (개인적으로는 강화학습은 그때그때 필요한 데이터를 손쉽게 만들어내는 방법이라고 생각한다.) 그러한 경험에 기반해 드디어 ChatGPT로 넘어간다.

 

 그 과정에서 핵심이 되는 질문은 "과연 거대한 Text Corpus에서의 빈 단어 예측이 신경망에 무엇을 학습시키는 것인가?"이다. 그는 인터넷의 문장들은 일종의 세상에 대한 투영이고, 문장의 가려진 빈칸을 맞추는 학습 방법은 그 세상을 이해해가는 작업이라고 주장한다. 충분히 더 큰 신경망에서는, 이렇게 학습된 모델(ChatGPT)이 단지 디지털 앵무새가 아니라 더 큰 추론의 힘을 지니는 무엇인가라는 말이다. 추리 소설을 예로 드는데 탐정이 여러가지 정보를 수집한 후 범인은 누구누구다 라고 맞추는 것을 예로 든다. 정확히 신경망 학습이 내부적으로 어떠한 의미 체계를 만들어 작동하는지 알 수 없지만, 무언가 추론 체계를 만들어 낸다는 말이다.

 

 그리고 이는 일부분 사실로 증명되고 있다. 1000억 파라메터가 넘어갔을때 ChatGPT는 단순히 흉내내기 그 이상으로 반응한다는 것이다. 아직은 완전하지 않더라도, 일반적인 고확률의 단어 시퀀스를 출력한다기보다는 무언가 다른 일을 해낸다. 그리고 그 이유는 이 신경망이 매우 크고, 엄청난 문장 데이터로 학습을 했기 때문이라고 이야기하고 있다. (물론 이러한 학습방법이 어디까지의 추론 능력을 부여할 수 있는지는 아직 여러가지 논쟁이 있다. 문장만으로 과연 기계가 어디까지 알아낼 수 있느냐는 의문이다)

 

 오히려 인간 대비 유리한 점은, 보통의 인간이 평생 배우지 못할 수많은 문장들을 모두 학습한다는 점이 있다. 그렇게 대규모의 신경망이 어찌보면 인간과 유사한 몇몇 기능을 수행할 수 있다는 사실을, 컴퓨팅의 진보와 실제 시행착오를 통해 증명했다는 점이 ChatGPT가 해낸 일이라고 할 수 있다는 주장이다.

 

 그러면 그 다음은 무엇인가? 신경망 학습이 가능해지는 범위내에서 더  큰 다른 유형의 데이터와 컴퓨팅으로 늘려가는 방법이 있겠다. 그러면 신경망은 훨씬 더 큰 맥락하에서 다양한 단어의 의미를 이해하고 더 넓은 추론이 가능한 신경망을 갖추게 될 수 있는 것은 아닐까? 그래서 영상에서는 멀티모달 관련된 내용이 나온다.

 

 대규모 Text Corpus에 맥락을 찾아내는 이 비지도 학습 외에 사진이나 영상, 음성에서 유사한 비지도 학습이 가능하게 된다면 어떨까? 문장이 가진 세계와 지식과 추론을 기계에게 가르칠 수 있다면, 이제 시각을 보여주고 영상, 음성을 보여줌으로써 더 많은 세상을 기계에게 이해 시킬 수 있다. 대담에서는 서츠케버가 ChatGPT에 시험 문제를 풀게 할때 다이어그램을 볼 수 있게 해주면 정답률이 올라간다고 이야기하고 있다. 더 많은 세상에 대한 정보를 줄 수록, 신경망의 크기만 키우고 컴퓨팅만 감당된다면, 그것이 어떻게든 가능해질 수 있다는 기대를 하게 되는 셈이다.

 

 물론 이런 세계에 대한 표상을 신경망이 갖더라도, 그것으로 무언가 우리가 원하는 일을 하게 하기 위해서는 강화학습이 별도로 필요하다고 이야기하고 있다(왜냐하면 text corpus가 표상하는 대로 생성하면 여러가지 좋지 않은 것들을 거르지 않고 출력하기 때문이다. 편견, 성인물 등) 그런데 어찌보면 AlexNet, 알파고, ChatGPT 등이 거쳐온 흐름은 명확해보인다. 더 큰 신경망과 연산 속도 더 큰 데이터를 가지면, 점점더 인간이 가진 지식과 능력을 신경망 안에 집어 넣을 수 있다는 믿음이 확산되는 것이다.

 

 ChatGPT는 당분간은 이러한 세계에 대한 표상을 사람에게 서비스하기 위해, 그 신뢰도를 높이는 작업들을 진행할 것으로 보인다. 그런데 앞서 지적했듯이 사진이나, 영상, 음성 등 기계에게 세상을 더 자세히 표현할 수 있는 것들을 더 학습시키면, 기존의 인간보다 더 많은 지식을 이해하고 그것의 총체를 더 다룰 수 있는 상태로 나아갈 수 있지 않을까 싶은 생각이 이 영상을 보고 떠올랐다. 인류가 기존에 보유한 최대한의 데이터로 세상을 표상한 후에, 여러가지 강화학습을 통해 맥락을 추가로 학습하고, 그것이 더 큰 신경망 더 많은 데이터, 더 손쉬운 비지도 학습법 등을 개발해나가면 점점 더 인간과 비슷한 기능을 갖추게 되는게 아닌가?

 

서츠케버는 지난 20년간의 이 분야 개척을 통해 그 사실을 깨달은 것이 아닌가 싶은 것이다.

 

결론적으로 이 대담을 통해 개인적으로 느낀 insight는 다음과 같다.

 

1) 대규모 언어 모델은 단지 인류가 모은 문장들을 가지고, 문장을 생성하는 디지털 앵무새라고 생각했었다. 인간이 하는 것과 같은 대화나 추론과는 거리가 있고 그것을 학습하는 방식은 아닌 것이라고 말이다. 그러나 다른 관점으로 생각해볼 수 있다.

 

2) 이제 충분히 큰 신경망을 어느정도로 안정화해서 학습할 수 있다. 더 많은 데이터(가급적 비지도 학습이 가능한)와 더 많은 컴퓨팅 그리고 이후에 강화학습을 통해 원하는 기능을 만들면 되는 상태가 아닐까 기대할 수 있게 되었다.

 

3) 지금 축적된 대규모 문장들은 인간이 가진 지식의 총합이다. 따라서 1)에도 불구하고 2)에 기반해서 신경망이 충분히 커지면, 단지 비어있는 단어를 학습하는 것만으로도 어느 정도의 추론 능력을 갖출 수도 있다. 기계는 인간의 아이와는 달리 이 세상에 대한 학습이 매우 어려웠는데, 비교도 할 수 없을 다양한 문장 들(인간이 평생 접하는 내용보다 훨씬 더 많은)로 좀더 비효율적이지만, 어쨌듯 목적을 일부 달성하는 방법을 찾은 셈이다. 아직까지 이러한 간접적인 학습이 가능한 것인지는 논란의 여지가 있지만, 일부분 되고 있는 증거가 없는 것은 아니다(물론 못한다는 증거도 같이 공존하지만)

 

4) 실제 세상에서 인간형태로 학습하는 무언가가 나오기 전이라도 이렇게 학습가능한 데이터를 더 큰 신경망에 학습시키는 전략도, 현재 기술로 가능한 AGI를 추구하는 방법이 될 수도 있다.

 

그 분야에서 많은 시행착오를 거친 지식이 아닐 수 없다. 과거 산업혁명을 이끈 증기 엔진 개발은 신비하게도 이론적으로 완벽하게 그것을 다룬 이들이 아니라, 여러가지 시행착오 속에서 이론에 부족함 많았던, 엔진을 개선시킨 엔지니어들을 통해 진행되었다는 역사를 인류는 한번 목격한 바 있다. 지금 이 분야도 그렇게 성장할 수도 있지 않을까. 신경망의 창발성이나 이론적 배경은 아직 모호하지만 그렇다고 앞으로 나갈 수 없는 것은 아닌 것이 아닐까. 대규모 문장과 컴퓨팅 그리고 신경망으로, 마치 직접적으로 의도하지는 않은, 인간에 필적하는 몇가지를 배울 수 있다니, 놀랍지 않은가. 좀더 신경망 상위 수준의 추상적인 학습 증진법이 개발되고 인간처럼 직접 대화하면서 기계가 배워나갈 수 있다면 무언가 AGI(일반인공지능)를 위해 더 시도해볼 수도 있게 되지 않을까 꿈을 꾸어 본다.

 

 

반응형
Posted by 작동미학