나름 IT 이야기

WSL 에 Ollama 설치후 '라즈베리파이' 에서 서비스하기

도림천 버섯돌이 2024. 6. 16. 00:53

2024.6.15

본인은 인공지능의 ㅇ자도 모르는 데다가 llama 라는 녀석에 대해서도 전혀 모릅니다. 집에 놀고 있는 라즈베리파이에 ollama 라는 게 돌아갈까 시도하다가 일이 엉뚱한 방향으로 정리가 되었습니다.

라즈베리파이 3B 는 램이 1 GB 뿐이라서 설치나 실행이 불가하고 라즈베리파이 4(Ram 8GB)에서는 설치 및 실행은 되지만 말 한번 걸면 답변하는데 5분 정도 걸리는군요.

GPU 가 있으면 답변이 빨라진다길래 GPU가 있는 Windows 머신에서 다시 시도했다가 결국에는 딸래미 방의 게임용 컴퓨터에서 테스트를 마쳤습니다. 시간을 보낸 대부분은  WSL의 네트워크 환경과 Windows의 방화벽 부분이었습니다. 

혹시라도 Windows 의 WSL에서 ollama 서비스를 시도하시는 분들께 시간 허비하지 마시라고 정리하여 공유합니다.

주 테스트 환경은 Windows 10 에 설치된 WSL2 Ubuntu 24.04 입니다.

 

1. Ollama 설치 및 실행

--ollama 설치
curl -fsSL https://ollama.com/install.sh | sh

-- llama3 모델 설치 및 실행
ollama run llama3

-- 설치 완료 후 자동으로 서비스가 올라오는데 내리거나 상태 파악용.
--sudo systemctl start ollama
--sudo systemctl status ollama

-- 혹시라도 systemctl 로 실행이 안되는 경우 다음 명령어로 직접 실행할 수 있습니다.
ollama serve
multitab@MULTITAB-T420S:~$ curl -fsSL https://ollama.com/install.sh | sh
>>> Downloading ollama...
######################################################################## 100.0%#=#=#         ######################################################################## 100.0%
>>> Installing ollama to /usr/local/bin...
[sudo] password for multitab:
>>> Creating ollama user...
>>> Adding ollama user to render group...
>>> Adding ollama user to video group...
>>> Adding current user to ollama group...
>>> Creating ollama systemd service...
>>> Enabling and starting ollama service...
Created symlink /etc/systemd/system/default.target.wants/ollama.service → /etc/systemd/system/ollama.service.
>>> The Ollama API is now available at 127.0.0.1:11434.
>>> Install complete. Run "ollama" from the command line.

multitab@MULTITAB-T420S:~$ ollama run llama3
pulling manifest
pulling 6a0746a1ec1a... 100% ▕█████████████████████████████▏ 4.7 GB
pulling 4fa551d4f938... 100% ▕█████████████████████████████▏  12 KB
pulling 8ab4849b038c... 100% ▕█████████████████████████████▏  254 B
pulling 577073ffcc6c... 100% ▕█████████████████████████████▏  110 B
pulling 3f8eb4da87fa... 100% ▕█████████████████████████████▏  485 B
verifying sha256 digest
writing manifest
removing any unused layers
success
>>> hello
Hello! It's nice to meet you. Is there something I can help you with, or would you like
to chat?

>>> who are you?
I am LLaMA, an AI assistant developed by Meta AI that can understand and respond to
human input in a conversational manner. I'm not a human, but rather a computer program
designed to simulate conversation, answer questions, and even generate text on a given
topic.

 

2. Web UI 설치

커맨드에서 테스트를 위해서는 위에 명령까지만 실행을 해도 됩니다. 텍스트보다 사용하기가 편한 웹 UI 환경을 추가로 설치를 해줍니다. 

-- 라즈베리파이 쪽에서 실행
docker run -d -p 3000:8080 -e OLLAMA_BASE_URL=http://192.168.1.5:11434/api -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/ollama-webui/ollama-webui:main
multitab@rasp:~ $ docker run -d -p 3000:8080 -e OLLAMA_BASE_URL=http://192.168.1.5:11434/api -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/ollama-webui/ollama-webui:main
Unable to find image 'ghcr.io/ollama-webui/ollama-webui:main' locally
main: Pulling from ollama-webui/ollama-webui
f546e941f15b: Pull complete
24935aba99a7: Pull complete
07b3e0dc751a: Pull complete
7e0115596a7a: Pull complete
a66610a3b2a1: Pull complete
c175d9a7d72d: Pull complete
118c270ec011: Pull complete
2560efb5a1fe: Pull complete
0a3a251ca3a9: Pull complete
e66887d25b67: Pull complete
e138e3ef45c8: Pull complete
ebe686cd15b0: Pull complete
cbb3a246d52b: Pull complete
133390a53c46: Pull complete
5691cbf1cdd3: Pull complete
Digest: sha256:d5a5c1126b5decbfbfcac4f2c3d0595e0bbf7957e3fcabc9ee802d3bc66db6d2
Status: Downloaded newer image for ghcr.io/ollama-webui/ollama-webui:main
64296c45a6a06e1fbe23b1656572bf321b008f1f4535059fadfa78df3fea81f2

multitab@rasp:~ $ docker ps
CONTAINER ID   IMAGE                                    COMMAND           CREATED          STATUS          PORTS                                       NAMES
64296c45a6a0   ghcr.io/ollama-webui/ollama-webui:main   "bash start.sh"   31 seconds ago   Up 13 seconds   0.0.0.0:3000->8080/tcp, :::3000->8080/tcp   open-webui
multitab@rasp:~ $

최초 접속 시 Sign up을 눌러 관리자로 가입해 줍니다. 

ollama와 같은 머신이라면 select a model을 선택하고 바로 질의를 시작할 수 있습니다.

 

저의 경우는 웹 UI 는 라즈베리파이에 있고 Ollama 서비스는 옆에 있는 WSL에서 돌고 있습니다. 몇 가지 추가 작업을 해주어야 합니다.

 

3. Ollama 서비스를 다른 머신에서도 접근 가능하도록 설정.

지금 상태는 127.0.0.1:11434 같은 형태로 서비스가 시작되어서 localhost 가 아닌 다른 머신에서는 호출할 수가 없습니다. 이건 일반적인 리눅스에서도 동일하게 발생하는 현상입니다.

환경 변수를 이용해서 0.0.0.0:11434와 같은 형태로 서비스되도록 해 줍니다. 그러면 다른 머신에서 호출할 수 있게 됩니다.

--기본 상태의 정보. 127.0.0.1:11434 
multitab@MULTITAB-T420S:~$ netstat -an|grep LIST
tcp        0      0 127.0.0.54:53           0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:11434         0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN

-- 서비스 대상을 0.0.0.0 으로 확장
/etc/systemd/system$ sudo vi ollama.service

Environment="OLLAMA_HOST=0.0.0.0:11434"

sudo systemctl stop ollama.service
sudo systemctl start ollama.service

-- 수정후 보이는 정보.
multitab@MULTITAB-T420S:~$ netstat -an|grep LIST
tcp        0      0 127.0.0.54:53           0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN
tcp6       0      0 :::11434                :::*                    LISTEN


-- systemctl 로 안 띄우고 serve 로 직접 띄우는 경우에는 다음처럼 해줍니다.
export OLLAMA_HOST=0.0.0.0:11434; ollama serve

 

4. Windows Defender에서 인바운드를 허가해 주어야 합니다. '고급 설정' 을 눌러 줍니다.

 

인바운드 규칙에서 '새 규칙'을 눌러 TCP, 11434 포트로 열어주고 ollama 등의 적당한 이름으로 저장해 줍니다.

 

 

5. WSL2 내부로 트래픽 포워딩

WSL의 경우 Windows 내에서 또 하나의 가상 네트워크 안에 갇혀 있어서 로컬 머신이 아니면 직접 접근할 수가 없습니다.

이건 마치 일반 가정집에 iptime 공유기가 있어서 외부에서 내부로 들어올 때는 별도의 포트 포워딩을 추가 해 주어야 하는 것과 마찬가지입니다.

WSL 의 ubuntu에서 ip를 확인해 보면 기존 192.x.x.x 대역이 아닌 172.x.x.x로 할당이 되어 있습니다.

multitab@MULTITAB-T420S:~$ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.26.26.152  netmask 255.255.240.0  broadcast 172.26.31.255
        inet6 fe80::215:5dff:fefc:d326  prefixlen 64  scopeid 0x20<link>
        ether 00:15:5d:fc:d3:26  txqueuelen 1000  (Ethernet)
        RX packets 3478238  bytes 5253250369 (5.2 GB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 2204187  bytes 173792701 (173.7 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 29199  bytes 3906540 (3.9 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 29199  bytes 3906540 (3.9 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

multitab@MULTITAB-T420S:~$

 

netsh 명령을 통해서 wsl 내부로 트래픽을 포워딩 해줍니다.

-- Windows (관리자모드) 명령어 프롬프트나 파워쉘에서 다음을 실행해 줍니다. 
netsh interface portproxy add v4tov4 listenport=11434 listenaddress=0.0.0.0 connectport=11434 connectaddress=172.26.26.152

--참고. 등록된 규칙 확인 및 삭제시 명령어.
--netsh interface portproxy show all
--netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=22

다만 이렇게 추가된 정보는 리부팅되면 사라지는 1회성입니다. wsl 의 ip 가 매번 바뀌기도 하고 새로 리부팅된 이후 해당 설정이 유지되지 않기 때문입니다. 지속적으로 사용하려면 바뀌는 ip 를 확인후 자동으로 추가해 주는 스크립트를 작성해야 합니다.

참고.

-- 방화벽이 안 열린 경우. defender 오픈 필요.
multitab@rasp:~ $ telnet 192.168.1.141 11434
Trying 192.168.1.141...
telnet: Unable to connect to remote host: Connection refused

-- 방화벽은 열렸지만 127.0.0.1 등의 이유로 서비스가 불완전한 경우. 다음과 비슷한 종류의 에러 발생.
multitab@rasp:~ $ curl http://192.168.1.141:11434
curl: (52) Empty reply from server
curl: (56) Recv failure: Connection reset by peer

 

6. WebUI 서버 정보 수정.

Settings에서 Ollama API URL 정보에 ollama 서버가 실행중인 wsl 의 ip를 넣어줍니다. 우측의 리프레시 같은 화살표를 눌러주면 반영이 됩니다.

 

7. 호출 테스트

제 노트북인 T420s에 설치된 서비스를 연결했는데 GPU(NVIDIA NVS 4200M)가 있음에도 동작을 안 하고 CPU 가 응답을 하는군요.

 

딸내미 방의 컴퓨터. NVIDIA GeForce RTX 3060 Ti 가 설치된 녀석입니다. 로딩 할때는 GPU 메모리가 올라가고 뭔가 물어보면 답변 속도가 엄청나긴 한데 GPU 는 쪼금 움찔하고 CPU 가 좀 더 반응하네요. 

 

반응형