GGUF 양자화 로컬 LLM 사용법 (일본어 로컬 위주로)
주의사항
이 글은 2024년 6월 말 시점에서 작성되었으며, 빠를 때는 1주일 단위로 최신 상황과 판도가 바뀌는 LLM 분야의 특성상 빠르게 퇴물이 될 가능성이 높음을 미리 언급함.
참고
이 글은 이미 python이나 git같은 기본적인 베이스를 설치할 수 있는 사용자를 대상으로 작성되었으며, 이미 설치한 상태를 전제하고 있음. 마찬가지로 Readme를 읽으면 설치 가능한 프로그램들의 설치법에 관해서는 Readme를 읽어 설치하라고 써두고 설치 방법에 관해서는 자세히 다루지 않음.
서문
로컬 LLM의 발전은 2023년부터 2024년 6월 현재까지 매우 활발하게 진행되고 있다. 하지만 발전하는 로컬 LLM을 가정용 컴퓨터를 소지한 일반 소비자 등이 접할 수단은 아직도 매우 한정적이며, 일정 수준 이상의 기본 컴퓨터 본체와 CUDA가 지원되는 GPU 자원이 거의 필수사항에 가깝다. 그러나 이러한 상황을 해소하기 위한 몇몇 수단들 또한 꾸준히 발전하고 있다. 이러한 수단들은 단순히 논문용, 보여주기 위한 이론들이 아닌 실사용을 해도 문제없는 수준으로, 일반 소비자들도 기업이나 사설망에 의해 감시되거나 검열되지 않는 로컬 LLM에 접근할 수 있게 해준다.
이 글에서는 8GB 미만의 낮은 VRAM GPU를 사용하는 열악한 저사양 PC가 로컬 LLM을 사용하는 것에 중점을 맞춘다. 이를 위해 7B에 해당하는 작은 일본어 LLM인 Vecteus의 GGUF 양자화를 이용하며, GGUF 양자화를 실행하기 위한 프로그램인 Koboldcpp, 로컬 LLM을 이용하기 위한 프론트엔드인 Sillytavern과, 일본어 소설 생성에 중점을 두고 있는 EasyNovelAssistant, 이 세 가지 프로그램을 설명하는 데 초점을 둘 예정이다.
GGUF 양자화 모델 사용하기
도모, 허깅페이스=상.
허깅페이스는 글을 작성하는 시점에서도 하루에 수십 개의 생성형 AI 관련 내용들이 올라올 정도로 활성화 되어있으며, 다양한 생성형 AI 모델과 데이터셋 등이 등록된 사이트다. 이 글에서는 로컬 LLM, 그중에서도 GGUF 양자화가 되어있는 일본어 로컬 LLM인 Vecteus를 다운받는다.
GGUF 양자화란?
GGUF(GPT-Generated Unified Format)에 관해서는 이 페이지에 자세하게 나와 있지만 안 읽고 넘길 사람들을 위해 간단하게 설명하자면, GGUF 형식은 LLM의 크기를 줄여 자원을 덜 소비하고 낮은 자원의 환경에서도 추론 속도를 올리는 여러 양자화 기술 중 하나다. 양자화는 기본적으로 필요 없는 부분을 가정하고 그 부분을 줄이는 기술이기 때문에 양자화 모델이 오리지널 모델보다는 약간의 성능 손실이 일어나지만, 손실을 감수할 수 있을 정도로 모델의 자원 소비량을 획기적으로 줄여준다.
예를 들어 7B 오리지널 모델의 경우 모델을 불러오는 데만 해도 보통 15GB~16GB의 VRAM이 필요하지만, GGUF로 양자화한 경우에는 극단적으로는 4GB의 VRAM만 있어도 모델을 로드 가능하다. 물론 양자화가 그만큼 이뤄지면 확연한 성능 손실이 일어나지만, 아마 이 글을 읽고 있는 독자들은 그런 사치스러운 고민이 허락된 상황이 아닐 것이다. 많은 양자화 중에 GGUF를 다루는 것도 이런 독자들을 전제하고 있기 때문인데, GGUF는 GPU만이 아닌 CPU와 RAM을 병행해서 구동 가능하기 때문이다.
허깅페이스 페이지 맨 위를 보면 검색창이 있을 텐데, 여기에 우리가 받을 Vecteus를 입력하면…
이렇게 Vecteus라는 이름을 가진 여러 모델이 뜬다. 우리가 이용할 모델은 이 중에서 Vecteus v1이다. Vecteus v2는 출력을 안정화 시키는게 조금 까다로워서 다루기 쉬운 Vecteus v1을 먼저 다룬 뒤, 몇 가지 다른 추천 모델들을 후술할 예정이다.
위 스샷에서 파란색으로 선택한 것은 Vecteus v1의 원본 모델이다. 우리는 GGUF 모델을 이용하고 싶으니 이 결과 중에 mmnga/Vecteus-v1-gguf를 선택해서 들어간다. (원본 모델을 만든 곳에서 직접 GGUF 양자화를 업로드 해놨지만, 받을 수 있는 GGUF 유형이 한정적이기 때문에 유저 mmnga가 배포하는 GGUF를 이용한다.)
이런 페이지로 이동하면, 표시한 부분을 눌러 모델을 다운받는 페이지로 접속한다.
으악!
겁먹지 말자. 무서운 거 아니다.
GGUF 양자화의 유형
GGUF의 기본 양자화 방식인 K-Quant는 Llama.cpp로 간단하게 할 수 있는 효율적인 양자화인데, 최근 이 GGUF 양자화를 더 효율적으로 하는 방법이 나왔다. 그게 바로 위 스샷에서 보이는 IQ가 붙은 양자화다. IQ(Improved Quantization)라고 부르는 GGUF 양자화 유형으로, 말 그대로 기존의 K-Quant 방식을 개선하여 고성능을 유지하면서 더 작은 모델을 만들 때 사용한다. IQ 양자화가 잘 이뤄진 경우는 IQ4_XS의 양자화 모델이 Q4_K_M 양자화 모델과 거의 비슷한 성능을 내는 경우도 있다. 두 모델은 약 500메가 정도의 용량 차이를 내며, 저사양 환경에 금쪽같은 여유 공간을 확보해주는 고마운 양자화 유형이다.
물론 IQ 양자화에는 단점도 있는데, IQ 양자화에는 퀄리티를 안정시켜주기 위한 최소한의 데이터셋이 필요하며, 간혹 이 데이터셋 때문에 원본 모델과 출력 품질이나 검열 정도가 달라지는 경우가 생긴다. 하지만 이건 소비자들은 알바 아니고 받은 GGUF 모델이 출력이 이상하면 모델 받았던 페이지 가서 IQ 양자화 데이터셋 이상한지 체크한 뒤, 그 데이터셋이 아닌 다른 데이터셋으로 IQ 양자화한 모델을 찾으면 된다. 그마저도 없으면 직접 해야겠지만 여기서는 다루지 않는다. 알려줄 다른 사람 찾아봐라.
여기까지 말했으면 알아들었지? 저 목록 중에서 저사양은 IQ붙은 파일을 받으면 된다. 자원에 어느 정도 여유가 있다면 IQ4가 붙은 파일을 시작 모델로 쓰는 것을 추천한다. 이유는 여기의 벤치마크 참고.
다른 모델을 구경하고 받고 싶다면 마찬가지로 검색창에 이름을 검색해서 돌아다니면 된다. 상위권 검색 결과 말고 다른 모델도 있나 구경하고 싶으면, 검색창에 나오는 See xx model results for "xxxx" 부분을 선택하면 뜬다.
원하는 파일을 다운을 받았다면 당장 쓸 수 있는 모델 파일은 준비됐다. 이제 실행을 해볼 차례다.
Koboldcpp에 GGUF 파일을 넣고 스위치
https://github.com/LostRuins/koboldcpp (깡 CPU와 NVIDIA GPU)
https://github.com/YellowRoseCx/koboldcpp-rocm (AMD 전용 포크)
Readme 읽고 필요한 환경 조성한 뒤 Release 페이지에서 알맞은 파일 다운로드.
스샷은 저걸 가지고 왔지만 우리가 이 화면을 볼 일은 없다. Koboldcpp는 GGUF 실행 발사대로 쓰일 예정이기 때문이다.
모델 파일과 Koboldcpp 실행 파일을 준비했으면, 다음을 실행한다.
- 모델 파일과 Koboldcpp 실행 파일을 한 폴더에 적절하게 몰아넣는다.
- 그 폴더에 새 텍스트 파일을 생성하고, 이름은 원하는대로 붙인 뒤 확장자를 bat으로 바꾼다.
- 2에서 만든 bat 파일을 메모장이나 notepad++, vscode같은 텍스트 편집 프로그램으로 연다.
- 다음 코드를 붙여넣고, 코드에 달린 주석에 따라 자신의 환경에 맞춰 수정해서 저장한다.
- 이제 모델 실행이 필요할 때마다 bat 파일을 실행해주면 알아서 koboldcpp가 GGUF 실행 발사대가 되어준다. 고마워요, koboldcpp!
여기까지 설정해뒀다면, 다음 설명에 사용하기 위해 미리 bat 파일을 실행해서 koboldcpp를 켜두자. 앞으로 필요하다.
(스샷 유실)
실행하면 cmd에 위와 같은 내용이 나온다. 이 창을 꺼두지 말고 최소화 해두자.
실리태번. 아아, 실리태번.
https://sillytavernai.com/how-to-install-sillytavern/ (공식 다운로드 페이지)
https://github.com/SillyTavern/SillyTavern (실리태번 Github)
런처로 설치하거나 Github에서 Readme 읽고 설치.
윈도우즈 기준으로 설치하고 SillyTavern 폴더로 들어가서 Start.bat 파일로 실행한다. 자동 업데이트 시키고 싶으면 UpdateAndStart.bat 파일로 실행.
실행해서 위와 같은 시작 화면이 뜨면 성공이다.
이제 밑에 빨간색으로 강조되어 있는 'API에 연결되지 않았습니다!'를 해결해보자. 위에 느낌표가 뜬 빨간 플러그 클릭.
창이 열리면 스샷과 똑같이 세팅해주자. 특히 사용자 정의 엔드포인트의 /v1을 /v1/로 붙여넣는 찐빠를 내지 않도록 주의한다. 이거 틀리면 제대로 작동 안한다. 세팅 한 뒤에 연결을 눌러 연결.
왜 Text Completion이 아니라 Chat Completion?
사실 Vecteus에는 Text Completion의 출력이 Chat Completion의 출력보다 몇배는 안정적이긴 하지만, 굳이 Chat Completion을 쓰는 이유가 있는데, Text Completion의 프롬프트 편의성과 Chat Completion의 프롬프트 편의성이 몇배는 차이나기 때문이다. Chat Completion의 몇몇 편의성을 Text Completion에서는 전혀 사용할 수 없고, 내가 써본 결과로는 이건 이 글을 읽어야할 수준의 초보자들이 어쩔 수 있는 수준이 아니기 때문에 스킵한다.
이제 프롬프트를 넣을 차례인데, 그냥 실리태번 기본 영어 프리셋 쓰고 마지막에 일본어만 쓰라고 지시해도 일본어로 잘 나오긴 한다. 하지만 일본어 프롬프트를 사용하고 싶은 사람들을 위해 내가 만들어둔 기본 프리셋이 있다. 사용하고 싶다면 다운 받자.
https://realm.risuai.net/character/af9693b8-5451-4931-a483-ad57936a03b3
들어가서 그냥 다운로드 말고 옵션 눌러서 ST 프리셋으로 다운로드
프리셋 조절 창은 API 연결에 썼던 플래그 옆의 아이콘을 누르면 열린다. 만약 내가 만든 프리셋을 사용하고 싶다면, 프리셋 조절 창에 빨간 네모로 표시한 아이콘을 눌러서 임포트 하자.
컨텍스트 크기는 아까 koboldcpp bat 파일에 설정했던 크기로 바꿔놓자. 최대 응답 길이는 최대 1024를 넘기지 않는 것을 추천한다. Vecteus는 생성 길이가 그 이상을 넘어가면 이야기의 일관성이 무너지거나, 갑자기 이야기를 멋대로 끝내고 다른 이야기를 시작하거나, 프롬프트를 뱉거나 하는 여러 찐빠를 내기 때문에 적당한 길이에서 끝나도록 너무 큰 크기를 지정하지 않는게 좋다. 온도는 이상한 글 보기 싫으면 0.9 이상은 지정하지 말자.
이 부분은 내 커스텀 프리셋을 받은 사람들만 참고하면 된다.
프리셋 조절 창의 스크롤을 내려서 주요 설정의 연필 부분을 클릭하면 저렇게 메인 프롬프트가 나오는데, 쓰여진대로 입맛에 맞춰서 알아서 적은 다음 저장 버튼 눌러서 저장하면 된다. 그리고 이걸 프리셋 자체에 저장하기 위해 프리셋 임포트 할때 사용했던 버튼 근처에 있는 프리셋 상태 저장 버튼을 눌러주는 것도 잊지 말자.
일본어 못해서 알아서 채워넣기 힘들어요, 라고 할 정도의 일본어 실력이면 Vecteus 지우고 얌전히 영어 모델 받아서 RisuAI에 Koboldcpp 연결해서 사용해라… 애초에 그정도 일본어 실력이면 Vecteus로 소설 가챠 자체가 힘듬.
이후 주요 등장인물 두명을 전부 일본어로 한명은 페르소나에, 한명은 캐릭터 봇카드로 작성하고, 퍼메도 넣은 뒤 생성하기 시작하면 끝.
페르소나는 이렇게
캐릭터 봇카드는 이렇게 한 다음
다 작성하고 저길 눌러서 저장하면 끝.
キャラクタつくーる やみおとめ対応版v13
https://ai-novelist-share.geo.jp/prompt/229
페르소나와 캐릭터 프로필 형식은 AI 노벨리스트의 비공식 프롬프트 공유 사이트에서 공유되고 있는 이 양식 참고해서 작성하면 좋음. 상당히 잘 알아들음.
그리고 이 탬플릿 외에도 여기서 공유되는 프롬프트를 프리셋으로 수정해서 사용해도 퀄리티가 좋음.
그럼 시험삼아 출력해보도록 하자.
대상은 씹덕의 교과서 동방 프로젝트의 레이무다. 페르소나를 마리사로 지정했고, 프리셋의 주요 설정을 동방 프로젝트 위주로 적절하게 만졌다. 퀄리티가 전반적으로 상당한 가비지 인풋이지만 동방 프로젝트니까 어떻게든 해줄거란 '믿음'으로 엔터키를 누르자.
신의 힘이다…!
믿음에 훌륭하게 부합해준 모습이다. 원작을 아는 사람들이라면 사실 적잖이 어색한 부분도 있고, 잘 보면 맥락이 이상한 부분도 조금 있지만 저 정도 가비지 인풋에 이정도 갓 아웃풋이 나왔다는건 그저 신의 힘이 아닐 수 없다.
물론 원작을 지정해도 제대로 안 나오는 경우가 훨씬 많다. 이런 경우에는 이따위 퀄리티의 가비지 인풋은 지양하고 열심히 인풋 설정을 채워주고, 열심히 가챠하면서 놀도록 하자. 리롤은 메세지 아래쪽에 붙은 화살표를 누르면 자동으로 된다.
번외: 인풋 딸깍 '해 줘'
'딸깍'
신의 힘이다…!
여기서는「Koboldcpp」와「EasyNovelAssistant」를 쓰죠.
https://github.com/Zuntan03/EasyNovelAssistant
대충 알아들었지? Readme 읽고 설치해라.
설치하고 원활하게 실행이 안 되면 컴퓨터 껐다 켜라.
실행 됐다면 이런 화면이 나올거다.
스샷에서는 이미 무언가 적혀있는데, 처음에는 전부 비어있는 화면이 정상이다. 컨텍스트 수는 메뉴의 모델에서 온도와 함께 조절 가능하니, Koboldcpp bat 파일에 지정한대로 바꾸고 재실행하자.
EasyNovelAssistant는 이미 자체적으로 내장되어 있는 프롬프트가 있다. 그걸 불러와보자.
메뉴의 특집 테마 - 템플릿: 소설 기획부터 프롬프팅을 클릭하면
이렇게 누군가가 정성스럽게 작성해서 공유해준 소설 플롯 가챠용 프롬프트가 나온다.
이 프롬프트가 있는 탭을 오른쪽 클릭해서 스샷에 보이는 '인트로 프롬프트'로 지정해주면, 채팅 프롬프트처럼 요청을 보낼 때 이 프롬프트가 제일 앞에 삽입되어 생성되는 내용의 일관성이 잘 유지되게 된다. 여기서 유지되는 일관성은 '작가로서 다양한 플롯을 작성'이다.
이제 생성에 집중해보자. 인트로 프롬프트는 탭이 분리되어도 유지되므로 생성만을 위한 새 탭을 열자.
그리고 메뉴의 생성 - 생성을 개시, 혹은 F3키를 누르면
이렇게 줄거리를 '딸깍'해준다.
참고로, 인트로 프롬프트의 저 부분을 원하는 내용으로 수정해주면
거기에 맞춰 내용을 체인지 해준다. 이제 가챠가 어느 정도 쌓일 때까지 방치해두자.
한동안 가챠를 하고 메뉴나 F4키로 생성을 중단한 뒤 거기서 SSR을 건졌으면 이제 SSR로 본격적인 소설 생성 던전을 돌 차례다.
원하는 내용이 나왔거나, 적당히 마음에 드는 내용끼리 따와서 교배시켰으면 인트로 프롬프트를 '생성한 설정과 플롯으로 집필'로 바꾼다.
그러면 이런 프롬프트로 바뀔텐데, 빨간 네모로 표시한 '소설 설정 정보' 밑에 마음에 드는 플롯을 복붙하고, 밑에 빨간 밑줄쳐진 '소설 본문' 밑 문장 부분을 플롯에 맞는 문장으로 한두문장 적어서 바꿔준다. 그 밑줄의 메모는 번역해서 참고하고 삭제한다. 그 외 프롬프트의 마음에 안 드는 부분이 있으면 재량껏 조절하고, 다시 생성 전용 탭으로 넘어가 생성을 시작한다.
이후 생성되는 문장을 실시간으로 복붙하거나, 마음껏 생성한 뒤 중지하고 원하는 문장만 취합해서 복붙하고 다시 생성을 시작하는 식으로 가챠하면 된다.
생성 탭에 문장을 복붙해서 추가하면, 이후 생성은 추가한 문장 바로 다음을 생성하기 시작한다.
마치며
딱히 할말은 없다. Enjoy.