macos에서도 구동되기 때문에 너무나 간단하게 llama3, gemma, phi-3, command-r 등 어느정도 한글이 되는 모델들을 다운로드 받아서 구동시킬 수 있다.
그리고 일단 이렇게 구동되면 langchain과도 바로 연결된다.
$ ollama run llama3:instruct >>> give me a joke Here's one: Why don't eggs tell jokes? (wait for it...) Because they'd crack each other up! Hope that made you smile! >>> Send a message (/? for help)
이렇게 구동이 되면 내부에 API 서버가 이미 구동되어 대기 상태가 된다(ollama serve 명령으로도 띄우는 것이 가능하다)
$ cat > langchain_ollama_stream.py from langchain.callbacks.manager import CallbackManager from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler from langchain_community.llms import Ollama
llm = Ollama( model="llama3", callback_manager=CallbackManager([StreamingStdOutCallbackHandler()]) ) llm("The first man on the summit of Mount Everest, the highest peak on Earth, was ...")
$ python3 langchain_ollama_stream.py
....
....
그 외에도 다양한 방식의 langchain사용이 가능하다. 잘 응용해서 사용해보자.
1) 간단한 invoke
from langchain_community.llms import Ollama
llm = Ollama(model="llama3")
llm.invoke("Tell me a joke")
2) 간단한 stream 형식의 출력
from langchain_community.llms import Ollama
llm = Ollama(model="llama3")
query = "Tell me a joke"
for chunks in llm.stream(query):
print(chunks, end="")
AI로 무엇을 하다보면 linux에 GPU로 환경을 구성하는데, 도대체 잘 이해가 가지 않는 것이 이 버전 관계다.
Ubuntu 버전, GPU 버전, NVidia driver버전, cuda 버전, cudnn 버전... 등등 헷갈린다. 이제 그 관계를 이해해보자.
결론은 지금 '24년초 시점에서는 Ubuntu 22.10, NVidia driver는 GPU버전에 맞는것(홈페이지 참조), CUDA는 11.8을 중심으로 설치하자. cudnn은 8.7 정도를 선택하면 되고 쉽게 바꿀 수 있다. 각각의 버전을 바꾸고 싶은데 다시 깔아야 할지 고민인가? 아래를 따라가보자.
0. 요약해보면 아래와 같다
A. NVidia driver는 여러개를 설치할 수 없고 내 GPU, 원하는 CUDA버전에 맞는 가장 최근의 driver를 설치한다
B. CUDA는 여러개의 버전을 설치해서 LD_LIBARY_PATH만 잘 바꾸면 그때그때 바꾸어 쓸 수 있다
C. cudnn은 CUDA안에 library만 교체하면 되므로 역시 필요할때마다 특정 CUDA버전의 버전을 덮어쓸 수 있다.
만약에 cudnn도 같은 CUDA에 여러가지 버전을 쓰려면 똑같은 CUDA를 여러개 복사해서 설치 한후, 그 각각에 cudnn을 설치하고 LD_LIBARY_PATH를 변경해서 쓰는 신공도 가능하다. cuda-11.8.A, cuda-11.8.B 식으로 설치하는 식이겠다
다만 버전 결정 순서는, 내가 쓸 프레임웍이 지원한는 CUDA 버전은? 그에 맞는 내 GPU에 호환되는 NVidia driver 버전은? 그에 맞는 cudnn버전은? 그리고 python 버전은? 식으로 결정되어 간다. cuda, cudnn, python은 여러개의 버전을 설치해놓고 번갈아가면서 쓸 수 있다.
1. 먼저 필요한 CUDA 버전이 중요하다. CUDA 11.8이 가장 많이 호환되는 CUDA 버전이다.
판단기준 : 내가 쓰는 프레임웍(pytorch, tensorflow?)이 지원하는 CUDA는 무엇인가? 대개 11.8이다
CUDA는 최근에 11, 12시리즈가 시장에서 주력으로 사용되는데, 많은 오픈소스 ML 프레임웍이 11버전을 지원한다.
특히 우리의 가장 중요한 친구 pytorch 2.1 미만 버전들이 CUDA 11에 의존한다. tensorflow나 주력으로 쓰는 framework들이 지원하는 버전을 확인해서 만약에 CUDA 12를 지원한다면 12버전을 쓸 수도 있겠다. 하지만 아직은 최신 프레임웍의 버전들만 간신히 지원하는 CUDA12를 쓸 용기는 없다. 우리는 가져다 쓰는 기존 소스코드들은 예전 버전인 경우가 더 많기 때문이다. 물론 CUDA12에 최신 버전 프레임웍을 설치해서 새로 소스코드를 짤 수도 있겠지만 그런 경우는 흔하지 않겠다.
그러니 CUDA 11.8을 설치하자. 참고로 아래는 tensorflow의 버전별 CUDA + cudnn 버전이다. 각 프레임웍들이 각각 이런 정보를 공개한다.
$ sudo ubuntu-drivers devices #추천 nvidia drivers를 찾을 수 있다(recommended)
$ sudo apt install nvidia-driver-535 #추천받은버전
$ reboot
이후 cuda를 다시 설치하되, nvidia driver만 skip하고 설치한다.
(ex> $ sudo sh cuda_11.8.0_520.61.05_linux.run / nvidia driver는 uncheck하고 진행)
2. NVidia driver는 아래와 같은 CUDA와의 호환 관계를 갖는다. 최신 CUDA는 최신 NVidia driver가 필요하다.
판단기준 : 내가 쓰는 CUDA 버전이 최신일수록, 최신의 NVidia driver를 가져다 설치해야 하는데, 내가 가진 GPU카드별로 지원하는 Driver 버전이 다르다. 오래되거나 어떤 GPU는 Driver 버전 지원도 나쁘다. 거꾸로 내가 써야할 CUDA 버전을 지원하는 NVidia driver를 지원하는 GPU를 사야할 수도 있다.
즉 어느정도 Driver 버전 이상이 되어야, 최근의 CUDA 버전이 지원된다. Linux와 Windows가 조금 다른 것에 주의하자.
그리고 언급했듯이, 유의할 것은 해당 Driver 버전 중 일부는 특정 GPU 카드를 지원하지 않을 수 있다. 따라서 내가 가진 GPU 카드가 지원되는 드라이버 버전을 선택하자. 각 지원 버전은 NVidia 사이트에서 역시 확인이 가능하다. 신기하게도 GPU마다 지원되는 버전이 들쑥날쑥하니 꼭 내 GPU카드가 지원하는 버전을 확인해두어야 한다.
혹시 내가 설치해서 쓸 OS Linux Package들이 이 드라이버 버전을 띄엄띄엄 지원할 수도 있으니, 아예 Linux에서 배포판 별로(ubuntu?) 지원되는 버전별로 찾아봐서 내 GPU를 지원하는지 확인할 수도 있다.
불행히도 nvidia driver는 multi로 쓸 수는 없고, 다시 설치하고 reboot해야한다. (다만 recommended가 너무 낮지 않으면 그것을 선택하면 좋다)
3. Ubuntu 버전과는 어떻게 되는가? 23.10보다는 22.04가 더 유리하다.
판단기준 : Ubuntu 배포판 버전이 아니라, 설치된 gcc 버전이 중요하다. CUDA 11을 컴파일하기 위해 구 버전인 gcc 10이 필요하기 때문이다.
Ubuntu 23.10은 GCC 13버전 컴파일러를 디폴트로 사용하는 반면, CUDA 11/cudnn 등 컴파일에 GCC 10가 필요다. 그래서 사실은 Ubuntu 23.10을 사용해도 GCC 10버전 컴파일러를 디폴트로 정하면 CUDA 11을 쓸 수 있다! 그런데 이 Ubuntu에서 GCC 버전을 왔다갔다 설정하면서 설치할 배짱이 없다면 그냥 Ubuntu 22.04을 설치하자.
혹시 Ubuntu 23.10을 써야한다면 아래 가이드를 참고하자. gcc 버전을 바꾸어 설치하는 방법과 다시 gcc 버전을 원복하는 방법이 나와있다.
그래서 이러한 번거로움 때문에 Ubuntu 22.04을 설치해서 운영하도록 추천하게 된다.
4. cudnn은 어떻게 할까?
판단기준 : CUDA 처럼 사용하는 프레임웍별로 필요한 버전을 설치해줘야한다. 대략 8.7 버전 정도가 현재는 제일 무난하다.
cudnn의 8.7.0버전은 CUDA 11과 12모두 각각에 개별 버전별로 따로 있다(즉 cudnn 8.7 버전이 CUDA 11, 12에 각각 별개의 배포판이 있다). 다행히 이 cudnn은 설치 후에도 쉽게 교체 및 추가 할 수 있다. 여러개를 설치하고 전환도 가능하다. 그저 배포하는 압축파일을 풀어서 폴더 그대로 기존의 설치된 cuda폴더의 include/lib 파일만 교체해주면 그만이기 때문이다.
예를 들면 CUDA가 /usr/local/cuda-11.8로 설치되어 있고 /usr/local/cuda -> /usr/local/cuda-11.8로 링크가 걸려있다고 치자. 그러면 cudnn은 해당 버전 압축 파일을 받아, 파일의 압축을 적절한 곳에 푼 다음에 아래처럼 복사해 덮어 씌우면 된다.
물론 버전이 바뀔때마다 같은 작업을 하면 된다. 그러니까 여러 버전의 압축을 풀고, 쓸때마다 버전을 바꾸어 복사한 후 필요한 프로그램을 실행하면 된다.
아래를 통해 cudnn 배포판 다운로드 (로그인이 필요하다) 하고 그 이하의 절차로 include/lib파일을 복사해버리자.
간단하게 버전을 어떻게 잡으면 될지 잡아보았다. 상기 모두 정상 설치되면 아래 명령을 통해 설치 정보를 알 수 있다.
$ nvcc --version nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2022 NVIDIA Corporation Built on Wed_Sep_21_10:33:58_PDT_2022 Cuda compilation tools, release 11.8, V11.8.89 Build cuda_11.8.r11.8/compiler.31833905_0
$ nvidia-smi
Sat Apr 27 16:54:09 2024 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 525.125.06 Driver Version: 525.125.06 CUDA Version: 12.0 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |===============================+======================+======================| | 0 NVIDIA GeForce ... On | 00000000:01:00.0 On | N/A | | 0% 39C P8 25W / 320W | 592MiB / 16376MiB | 0% Default |
흥미로운 것은 위 nvidia-smi의 CUDA은 추천 cuda 버전이다.
실제 설치 cuda 버전은 nvcc 명령으로 확인하자.
5. python 버전은 어떻게 할까?
이것이야말로 실행할 프로젝트에 따라 다른데 대략 3.9~3.11정도가 추천되고 있다. 각 프로젝트별로 매우 세분화된 python버전을 요구할 수 있다(3.10.8이상 등). 따라서 설치할 프로젝트를 유심히 보는 수 밖에 없다. 하지만 우리는 여러개의 프로젝트를 실행하게 되기 때문에, 이 문제를 해결하기 위해 Anaconda(conda)를 사용하게 된다. 각 환경 별로 서로 다른 python과 package를 설정해 다중으로 사용하게 할 수 있는 합리적인 방법이다. Anaconda설치는 간단히 웹서핑해서 최근의 버전을 설치하면 된다. 서로 다른 버전으로 서로 다른 패키지 환경을 구성해 실행하는 것이 Anaconda의 마법같은 장점이다.
Anaconda를 설치한 후 아래와 같은 형태로 이 python 버전에서 자유로워지자. 꼭 미리 conda create 명령으로 전용 환경을 구성한 후 conda activate를 통해 해당 환경을 활성화하고 실행하는 것이다. 디스크 용량을 필요로 하긴 하지만, 이보다 더 편안한 방법도 드물다. 적극 활용하도록 하자. (설치 경험이 없으신 분은 https://jongsky.tistory.com/21 를 참조하자) 아래는 대표적인 환경 구성 및 활성화, 설치 명령이다.
$ conda create -n llama2 python=3.9 -y
$ conda activate llama2
(llama2) $ pip install ...
$ ..
$ exit
이제 이 글을 몇번 앞뒤로 왔다갔다 하면서 설치해서 사용해보면, 여러분은 이제 어떤 버전이든 대응할 수 있게된다.
>> Downloading ollama... ######################################################################################################################################################################## 100.0%######################################################################################################################################################################## 100.0%######################################################################################################################################################################## 100.0% >>> Installing ollama to /usr/local/bin... [sudo] userid 암호: >>> Adding ollama user to render group... >>> Adding current user to ollama group... >>> Creating ollama systemd service... >>> Enabling and starting ollama service... >>> NVIDIA GPU installed.
$ ollama serve #설치 후 자동 실행되지만 나중에는 이렇게 실행하면 된다. Error: listen tcp 127.0.0.1:11434: bind: address already in use $ ollama run llama3 pulling manifest pulling 00e1317cbf74... 100% ▕███████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ 4.7 GB pulling 4fa551d4f938... 100% ▕███████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ 12 KB pulling 8ab4849b038c... 100% ▕███████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ 254 B pulling c0aac7c7f00d... 100% ▕███████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ 128 B pulling db46ef36ef0b... 100% ▕███████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ 483 B verifying sha256 digest writing manifest removing any unused layers success >>> IT팀에 첫 부임하는 팀장인데 한글로 멋진 연설문을 써줘 Here's a potential team leader speech for your IT team in Korean:
---
**환영, 팀!**
저는 이날 처음으로 IT팀의 팀장이 되어 честь을 받은 것입니다. 함께 일하게 될 각자에게 고마워하는 기회를 가질 수 있습니다. 저는 이렇게 팀을 이끌어갈 수 있는 영광을 느끼고 있습니다.
** 우리의 사명 :* 우리 팀의 목표는 단순합니다. 이를 달성하기 위해 저는 각자의 강점과 재능을 활용하여 최고의 성과를 내겠습니다. 우리는 개별적으로는 아니라, 함께 일하는 조직체입니다. 기업의 성공을 위한 혁신적인 솔루션을 제공하며, 협동, 창의, 지속적 학습의 문화를 형성하겠습니다.
** 우리의 강점 :* 각자가 가진 Unique Skill, Perspective, Expertise 등을 활용하여 더 큰 것을 만들 수 있습니다. 우리는 소프트웨어 개발부터 지원까지 다양한 업무에 종사할 것입니다. 저는 각자의 재능을 믿고 있습니다.
** 앞으로의 도전 :* 저는 도전이 있을 줄 알아요. 하지만 저는 각자에게 믿음을 갖고 있습니다. 우리는 함께 도전을 맞아내고, collective Wisdom, Creativity, Determination 등을 사용하여 어떤도전이라도 이겨낼 것입니다. 우리는 실수를 통해 성장하고, 더 강한 팀이 될 것입니다.
** 이를 기대할 수 있는 것은 :* 저는 팀 리더로서 다음과 같은 약속을 합니다. 1. **오픈 커뮤니케이션** : 각자의 아이디어, 우려, 제안 등을 들으겠습니다. 각자의 목소리가 들립니다. 2. **클리어 골스** : 우리는 실제적 목표를 설정하여, 누구나 무엇을 위해 일하는지 알 수 있습니다. 3. **서포트 & 리소스** : 저는 각자가 필요한 도구, 교육, 지원 등을 제공할 것입니다. 4. **리코gnition & 레워즈** : 우리는 우리의 성공을 축하하고, 개인적인 공헌을 인정하여 서로를 이끌어갈 것입니다.
** 미래 :* 저는 이제 새로운 챕터에 들어가게 될 것 같습니다. 저는 이 팀이 어떤 것을 성취할지 궁금해합니다. 함께 이룰 수 있는 것은 무엇인지 찾아보겠습니다!
--- I hope this speech is inspiring and motivating for your IT team! Remember to tailor it to your team's specific needs and goals. Good luck with your new role as team leader! 🚀 --------------------------------------------------------------------------------------------------------- 아래 링크에 ollama로 구동할 수 있는 모델이 나온다. llama3는 8B 4bit quantized 모델로 4.7GB정도 용량이다.
참고로 $ ollama run llama:70b 형태로 70B모델도 구동도 가능하다. 아래 각 모델의 세부 정보를 통해 어떤 형태까지 구동할 수 있는지 태그명을 알 수 있다.
SYSTEM "You are my AI assistant. you should answer in Korean"
$ ls
modelfile
Llama-3-Open-Ko-8B-Instruct-preview-Q6_K.gguf
$ ollama create llama-3-open-ko-8b-q6 -f modelfile transferring model data creating model layer creating template layer creating system layer creating parameters layer creating config layer using already created layer sha256:62c16633326decbe7273021ad9178315347282763373fac0654773e35deeeb41 writing layer sha256:e6836092461ffbb2b06d001fce20697f62bfd759c284ee82b581ef53c55de36e writing layer sha256:9aa5bc598c7961cbdfa0ec4dc7f94384f8dd2d6a314997b7900dc95ebf30c790 writing layer sha256:ed11eda7790d05b49395598a42b155812b17e263214292f7b87d15e14003d337 writing layer sha256:c0e945a015bccb863dcba3fb16fc7f9aed7fb244a4ea7401c91d72561881e759 writing manifest success
$ ollama list NAME ID SIZE MODIFIED gemma:instruct a72c7f4d0a15 5.0 GB 3 hours ago gemma:latest a72c7f4d0a15 5.0 GB 6 minutes ago llama-3-open-ko-8b-q6:latest e3420f154241 6.6 GB 50 seconds ago
$ ollama run llama-3-open-ko-8b-q6
>>> 서울의 관광지를 소개해줘
서울은 한국의 수도라 문화적, 역사적으로 중요한 도시예요. 추천해 주세요. 그리고 가 봐야 할 곳이 있어요. 1. 경복궁: 조선 왕조의 주요 궁궐, 꼭 봐야 하는 방문지 2. 남산 타워: 서울을 상징하는 이 타워는 숨막히는 전망을 제공해요 3. 북촌 한옥 마을: 한국 전통 건축을 보여주는 마을 4. 명동 쇼핑 지구: 현대 한국의 패션, 쇼핑을 경험하세요 5. N서울타워: 관람 데크에서 도시의 파노라마 뷰를 즐기세요. 가장 먼저 방문하고 싶은 곳은요?