Get it on Google Play


Wm뮤 :: 라마샵 LLaMaSharp 사용법

블로그 이미지
가끔 그림그리거나 3D모델링하거나
취미로 로봇만드는
전자과 게임프로그래머 (퇴사함)
2022.3.22f1 주로 사용
모카쨩
@Ahzkwid

Recent Comment

Archive


2025. 5. 24. 09:23 AI

 

 

 

 

 

https://youtu.be/5WpHA-wr_l4

 

 

 

이름에도 보다시피 LLM, 즉 AI를 C#에서 사용하기 위한 라이브러리다 

 

파이썬이 일반사용자용 프로그램만들때 거지같은 점이 있기 때문에

(내가 파이썬을 쓰레기 언어라고 하는 이유중 하나다)

윈폼과 융합하려는 시도가 있었고

그 결과물이 LLaMaSharp이다

 

NuGet은 두개 받아야 한다

CUDA 많이 쓰는데 CUDA 안 깔은 이유는 호환성을 위해서다.

CUDA는 엔비디아 전용이라 암드유저와 이용환경 차이가 발생하니까

그냥 혼자쓸거면 CUDA용으로 깔아도 된다.

 

CUDA없이 CUDA용으로 깔아도 작동 자체는 되지만 난 비추천한다

차세대 OpenGL인 Vulkan이 있는데 뭐하러 개구진 Cuda를 쓴단말인가

위에서도 일반사용자 때문에 파이썬 구리다했는데 Cuda써서 또 사용자 쳐낼거면 이거쓰는 의미가 없다

 

 

이제 모델을 준비해야 할 차례인데 보통은 Hugging Face에서 다운받는다

https://huggingface.co/

 

Hugging Face – The AI community building the future.

The Home of Machine Learning Create, discover and collaborate on ML better. We provide paid Compute and Enterprise solutions. We are building the foundation of ML tooling with the community.

huggingface.co

(기분나쁘게 생겨서 한번만 봐도 뇌리에 남는다. 아 그거!)

 

GGUF와 GGML이 있는데 GGUF를 권장한다

 

왜냐면 GGUF가 더 최신 포맷이기 때문에

 

 

나는 TinyLlama모델을 썼다

왜냐고? 가벼우니까

근데 쓰다보니 phi2모델보다 좋은듯한 느낌이 들음

 

먼저 Hugging Face상단에 TinyLlama라고 검색한다

 

 

 

그러면 이렇게 주르륵 뜰건데 GGUF를 받아야 한다

 

 

 

 

 

https://huggingface.co/TheBloke/TinyLlama-1.1B-Chat-v1.0-GGUF/tree/main

 

TheBloke/TinyLlama-1.1B-Chat-v1.0-GGUF at main

 

huggingface.co

 

 

이거

참고로 gguf는 여러가지 버전이 있는데 Q가 낮을수록 경량모델이다.

Q는 비트수를 줄임으로서 경량화 한것이며 Q2는 2비트 Q3는 3비트이다

그런데 Q2나 Q4나 동일하게 Int4연산에 들어가서 그런진 몰라도 처리속도가 비슷하게 나온다

찾아보니 Q2랑 Q4 차이는 처리속도보다는 메모리사용량에 따라 선택하라고 한다. 어쩐지

이 윗단계로는 f16이 있다

그리고 모든 gguf 네이밍규칙에는 뒤에 무인/S/M/L이 있는데

스케일 조정에 따른 압축률에 따라 분류하는것이라고 하는데

어차피 윗단계 비트보다 작게 조정되므로 그냥 소숫점이라고 생각하면 된다. 무인=0, S=0.25,M=0.5,L=0.75

그러니까 Q2_K_S는 대충 2.25정도의 성능 Q4_K_M은 4.5정도의 성능

그래서 왠만하면 Q4_M을 쓰는게 좋은듯

심지어 해당 모델의 설명을 읽어보면 이중 Q4_K_M 모델이 제일 쓸만하다고 한다

그리고 0이 붙은건 안 쓰는게 좋다. 구형형식이라서

 

 

 

다 받았으면 빌드후 나오는 exe 있는곳에 Models폴더 만들고

 

Models 폴더에 이렇게 넣어준다

 

 

 

 

 

 

 

 

 

코드는 이 세곳을 참고해서 짜야한다

https://github.com/SciSharp/LLamaSharp

https://huggingface.co/TinyLlama/TinyLlama-1.1B-Chat-v1.0

https://huggingface.co/TheBloke/TinyLlama-1.1B-Chat-v1.0-GGUF

 

 

 

 

 

근데 프롬프트를 잘 짜야 한다 안 그러면 아래처럼 된다

 

(뇌절킹)

 

ㅡㅡ 프롬프트 짜는거 ㅈㄴ 어렵다

 

기능상 자동완성과 큰 차이가 없기 때문에 역할을 제대로 주지 않으면 나불거리기만 한다

사람또한 '자기 자신은 무엇이다' 라는 기억을 통해서 주체와 행동을 확립하지 않는가? 비슷하다고 보면 된다.

 

다행스럽게도 프롬프트를 쉽게 짤수 있게 ChatSession이라는 클래스가 있다

 

 

 

 

내가 사용한 코드는 아래에 올려두었다

https://gist.github.com/ahzkwid/e8f0454f4501921f56519d2ec516ddb7

 

LLaMaSharpSample

LLaMaSharpSample. GitHub Gist: instantly share code, notes, and snippets.

gist.github.com

using LLama;
using LLama.Common;
using LLama.Sampling;
using System.Diagnostics;

namespace LLaMaSharpSample
{
    internal static class LLM
    {
        private static ChatSession _chatSession;

        static LLM()
        {
            var modelPath = "Models/tinyllama-1.1b-chat-v1.0.Q4_K_M.gguf";
            var modelParams = new ModelParams(modelPath)
            {
                ContextSize = 2048
            };

            var weights = LLamaWeights.LoadFromFile(modelParams);
            var context = new LLamaContext(weights, modelParams);
            var executor = new InteractiveExecutor(context);

            var chatHistory = new ChatHistory();
            chatHistory.AddMessage(AuthorRole.System,
                "You are a concise and helpful assistant. Respond in a single short sentence.");

            _chatSession = new ChatSession(executor, chatHistory);

            Debug.WriteLine("NLP()");
            Debug.Write("User:");
        }



        public static async void Chat(string userInput)
        {
            Debug.WriteLine($"{userInput}");

            var inferParams = new InferenceParams
            {
                MaxTokens = 256,
                AntiPrompts = new List<string> { "User:" }, 
                SamplingPipeline = new DefaultSamplingPipeline()
            };

            Debug.Write("\n");

            await foreach (var token in _chatSession.ChatAsync(
                new ChatHistory.Message(AuthorRole.User, userInput),
                inferParams))
            {
                Debug.Write(token);
            }

        }
    }
}

 

 


https://youtu.be/5WpHA-wr_l4

 

이제 좋같은 파이썬 안 써도 된다

 

야호

 

 

UI나 클래스는 알아서 붙이자

 

 

 

 

 

 

 

 

 

 

'AI' 카테고리의 다른 글

AI 번역기 만들기 TinyLLaMa vs Phi-2  (0) 2025.05.26
인공신경망 작동 원리  (0) 2025.02.18
AI 환각현상과 분리뇌 현상의 유사성  (0) 2025.02.04
posted by 모카쨩

저사양 유저용 블로그 진입