순수수학2023. 6. 8. 00:43

1. 왜 수학은 인간에게 직관적이지 못할까?

 

 수학공부를 하면서 방정식을 보면 무슨 의미인지 금방 떠오르는 상태(수학적인 감각이 충만한)를 동경한 적이 있다. 그러나 지금에 와서 보면 그것은 그저 작은 영역에서나 가능한게 아닌가 싶다. 인간은 수학이라는 논리 체계를 자연스럽게 받아들이기 어렵다.

 

 -1과 -1을 곱하면 양수 +1이 되는 부분은 해당 연산 체계가 무모순적이 되기 위한 필수인데, 인간은 직관적으로는 이것을 받아들이기 어렵다. 외우거나 혹은 이렇게 해야만 모순이 없다는 사실을 그저 받아들여야 한다. 그러나 음수와 양수를 대칭상에서, 한 직선상의 양측 관계로, 마음으로 이해한다면, -1과 -1을 곱하는 것이 음의 반대방향으로 가는 것이라는 직관에 다가가게 된다. 당연하게 보자마자 양수가 떠오르게 될 수도 있겠다. 뜨거운 것을 만지면 그러기 싫어도 앗뜨거워 하면서 소리를 지르는 것처럼 말이다.

 

 그러나 인간의 직관이란 상당히 편협한 시간과 공간, 경험에 의존하게 된다. 우리의 머리속은 떨어지는 공을 자연스럽게 받아들일 수 있지만, 미시세계의 일은 도저히 이해할 수가 없다. 만약에 우리가 미시세계에서 지속 살아왔더라면, 반대로 떨어지는 공을 자연스럽게 받는 것같은 일을 도저히 이해할 수 없었을 것이다. 그런 세상은 거시세계라는 뉴튼 역학의 방정식으로나 존재하는 세상인 것이다. 대체 이해할 수가 없는.

 

 그래서 미시적인 세계는 양자역학 파동방정식에 의해서 아름답게 기술되고 정확히 예측할 수 있지만, 인간은 아무리 들여다봐도 그 방정식이 나타나는 세계를 머리속에 아주 명료하게 떠오르기란 쉽지 않은 것이다.

 

 그렇다. 애초에 수학이 바라보는 세상과 사람이 바라보는 세상은 근본적으로 다르다. 전자가 훨씬더 객관적이고 정밀하다. 후자는 살아남기에 급급한 생물이 갖추어야할 수많은 본성에 사로잡혀 있으므로(!) 이 아름답고 우하한 수학 방정식들을 직관적으로 이해하기가 쉽지 않겠다. 그리고 불행히도 자연은 이 수학을 쏙 빼닮았다. 그래서 사실은 마치 인간이 아주 편안하게 자연을 이해한다고 생각하겠지만, 실제 자연의 모든것을 이해하기 어려운 것이다. 직관적이지 않은 수많은 것들이 자연 어딘가 극단의 세계에 가득하다. 기나긴 수렵채집 기간을 지나오는 동안 생존에 목마른 인간이 전혀 관심갖을 만한 모습이 아니라면, 이런 극단들을 이해할 수 있는 틀 같은 것은 갖출 수 있었을 리 만무하다. 의식주 해결하기 바쁜데 보이지도 않는 블랙홀이나 분자수준의 일이 대체 무슨 상관이었겠는가.

 

 그래서 수학을 직관적으로 이해하지 못하는 것은 우리 거의 모든 인류가 마찬가지라고 볼 수가 있겠다. 오히려 훈련을 통해 상상력을 통해 그것을 극복해낸 선대 과학자들이 존경스러울 따름이다. 캄캄한 방에서 보지도 듣지도 못하는 것을 온갖 실험과 가설을 통해 시행착오 끝에 알아낸 것 아니겠는가. 그 과정이 얼마나 쉽지 않았겠는가. 리처드 파인만 교수가 이야기한대로 "자연은 우리보다 훨씬 더 큰 상상력을 지녔다."

 

2. 무한에 대해 이해하기

 

 무한은 자연에서는 관측하기 어렵지만, 수 체계에서는 어렵지 않게 만날 수 있다. 사칙연산 중에 0으로 나눔으로써 순식간에 무한을 창조해낼 수 있다. 혹은 간단하게 모든 자연수의 집합을 가정함으로써 무한개의 원소를 가진 존재를 만들어 낼 수 있다. 자연에서는 도통 확인할 수 없는 전체로의 무한이, 수학에서는 이렇게 종종 나타난다.

 

 인류가 이 무한을 이해할 수 있는 체계를 갖추었다는 것은 더이상 그 앞에서 더 진도를 못나간거나 함정에 빠지지 않아도 된다는 것을 의미한다. 모든 자연수의 집합을 가지고 무언가를 하려면 전에는 쉽지 않았다. 그것이 무엇을 의미하는지 명확히 설명하기가 어려웠기 때문이다. 무한을 그저 증가하는 상태라고만 여겼지, 전체적으로 이해하지 못했기 때문에 그것을 하나의 값으로 다룰 수가 없었다. 그래서 수없이 많은 벽에 마주했었다.

 

 간단하게는 만약에 우주가 가진 시간이 무한히 끝나지 않는다고 가정해보자(개인적으로는 그러지 않을 아무런 증거도 현대과학이 찾지 못했다고 생각한다) 만약에 우리가 무한을 제대로 이해하지 못하고 있다면 우리는 이 상황을 수학적으로 기술하기 어려웠을테고 이것을 통째로 다루지도 못했을 것이다. 그러나 지금은 그렇지 않다. 이 무한의 시간에서 예측하고 싶은 것이 있다면? 당연히 예측할 수 있다. 가장 간단하고 흥미로운 것이 엔트로피의 법칙이다. 밀폐되고 고정된 공간안에서는 뜨거운 물과 차가운 물이 만났다고 치자. 곧 모든 분자들이 무질서도가 극대화된 상태로 달려가서 그 중간온도 어디에서 평형을 이룬다. 그런데 만약 무한의 시간이 주어진다면 어떻게 될까? 정답은 처음대로 돌아가는 상황이 생긴다. 그것도 무한번 생긴다.

 

 물론 자연의 우주는 가속팽창하고 있다고 인정받기 때문에 이 상황을 우주에 적용할 수는 없지만, 우리는 무한의 무엇인가를 이제 제법 특정 값으로 상정하여 예측해볼 수 있다.

 

 인간이 수학적인 체계내에서 직관을 넘어서 무언가를 이해하고 그리고 그것을 써먹을 수 있는 재미있는 것 중의 하나가 이렇게 무한이라고 생각한다.

 

반응형
Posted by 작동미학
머신러닝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 작동미학