
در این مقاله قصد داریم روش های های مختلف اجرای LLM بصورت Local را بطور کلی بررسی کنیم.
لازم به ذکر است در این مقاله برای پیاده سازی از ویندوز استفاده شده است.
در ابتدا به بررسی برخی اصطلاحات و ابزارها میپردازیم و سپس در ادامه چند نمونه را اجرا میکنیم.
مدل های زبانی یا LLM
LLM یا Large Language Model یک نوع مدل از هوش مصنوعی است که با استفاده از اطلاعات بسیار زیاد آموزش دیده و قابلیت درک و تولید زبان انسان را دارد.
معروف ترین فرمت های مدل های زبانی
فرمت GGUF: این فرمت یکی از رایج ترین فرمت های حال حاضر است که برای دستگاه ها با توان پایین و همچنین اجرا بر روی CPU بهینه شده است. در واقع این فرمت کوانتیزه شده و برای اجرای سریع تر میباشد. این مدل بر روی GPU نیز قابل اجراست اما برای بهره وری کامل و استفاده کامل از GPU بهتر است سراغ فرمت های دیگر برویم.
فرمت pt: فرمت خروجی مدل ساخته شده با استفاده از PyTorch میباشد ولی برای اجرای عملیاتی مناسب نیست و شاید امن نباشد.
فرمت pb و ckpt: فرمت خروجی مدل ساخته شده با استفاده از TensorFlow میابشد که ckpt برای آموزش مدل و .pb برای خروجی نهایی مدل در محیط عملیاتی استفاده میشود.
فرمت safetensors: یک فرمت مدرن برای مدل های زبانی میباشد که قابلیت اجرای مستقیم و امن بر روی GPU را دارد. این فرمت معمولا از روی فایل های pt ساخته میشود.
فرمت onnx: بهترین فرمت برای اجرا در محیط های عملیاتی میباشد. این فرمت مستقل از ابزار توسعه بوده و سایر فرمت های PyTorch و TensorFlow قابل تبدیل به این فرمت هستند. اما باید توجه کرد که TensorFlow یک اکوسیستم کامل دارد و راه بهینه ای برای اجرا در محیط عملیاتی در دسترس قرار میدهد.
ابزارها و برنامه ها
CUDA:
CUDA یا Compute Unified Device Architecture یک پلتفرم توسعه داده شده توسط انودیا برای اجرای موازی پردازش ها بر روی GPU های این شرکت میباشد. با استفاده از این قابلیت میتوان پردازش های مورد نیاز را بطور مستقیم بر روی GPU اجرا کرد. معادل این ابزار برای GPU های AMD با نام ROCm عرضه شده اما در حال حاضر نسبت به CUDA قابلیت های محدودتری دارد و در حال پیشرفت است. برای اجرای مدل زبانی بر روی GPU انودیا ضروری است که GPU از این امکان پشتیبانی کند و ورژن مناسب CUDA و همچنین نسخه درایور متناظر با ورژن CUDA نصب گردد.
llama.cpp:
این ابزار یکی از مهم ترین و پرکاربردترین ابزارهای حال حاضر برای اجرای مدل های زبانی با فرمت GGUF است. این ابزار قابلیت اجرای فرمت ها GGUF را با کمترین منابع بر روی CPU یا GPU فراهم میکند. Llama.cpp با زبان c++ نوشته شده و برای اجرا باید بر روی سیستم مورد نظر کامپایل شود. همچنین در صورت نیاز به اجرا بر روی GPU باید حین کامپایل پارامتر مورد نظر فعال گردد.
Ollama:
یکی دیگر از ابزارها Ollama نام دارد که در قالب یک برنامه کامل به کاربر امکان دانلود و اجرای مدل های زبانی را بدون پیچیدگی میدهد. این ابزار در پس زمینه از llama.cpp برای اجرای مدل های زبانی استفاده میکند به همین دلیل قابلیت اجرای مدل های کوانتیزه شده GGUF را دارد. در صورت نصب ورژن مناسب CUDA و پشتیبانی GPU، این ابزار مدل را بر روی GPU اجرا میکند(باید آخرین نسخه Ollama بر روی سیستم نصب باشد و همچنین از مدل مناسب برای GPU استفاده گردد تا این ابزار برای اجرا از GPU استفاده کند).
PyTorch:
یک Framework محبوب برای توسعه و اجرای مدل های زبانی است و از فرمت های .bin , .pt, .safetensors پیشتبانی میکند. PyTorch یک ابزار قدرتمند میباشد که در کنار Transformers بهترین گزینه برای توسعه و آموزش(Train) مدل های زبانی است. از PyTorch برای اجرا در محیط های عملیاتی نیز استفاده میشود اما به دلیل احتمال استفاده غیربهینه از منابع و همچنین در صورت نیاز به پردازش های توزیع شده، ابزارهای مناسب تری وجود دارد یا اینکه باید در کنار ابزارهای دیگر مورد استفاده قرار گیرد.
TorchServe:
یک ابزار برای استقرار و استفاده از مدل های PyTorch در محیط عملیاتی میباشد.
TensorFlow:
TensorFlow نیاز همانند PyTorch یک Framework محبوب برای توسعه و اجرای مدل های زبانی است. نسبت به PyTorch پیچیدگی بیشتری دارد و برای مقیاس پذیری برای مثال در محیط کلود قابلیت های بیشتری ارائه میدهد. به دلیل وجود یک اکوسیستم بزرگ و بهینه برای اجرا در محیط های عملیاتی بیشتر مورد توجه است.
TensorFlow Serving:
یک ابزار برای استفاده از مدل های TensorFlow در محیط عملیاتی میباشد.
ONNX Runtime:
یک ابزار قدرتمند و cross-platform برای اجرای مدل های زبانی با فرمت onxx میباشد. همانطور که گفته شد میتوان مدل های آموزش داده شده PyTorch و TensorFlow را به این فرمت تبدیل کرد و بعد در محیط عملیاتی بطور بهینه بر روی سخت افزارهای مختلف اجرا کرد.
علاوه بر ابزارهای گفته شده، برنامه ها و ابزارهای مختلف دیگری نیز وجود دارد که در آینده در این مقاله قرار خواهند گرفت.
در این مثال برای اجرای مدل بر روی GPU از سیستم عامل ویندوز و ورژن 11.8 CUDA استفاده شده و حداقل نسخه درایور نصب شده باید نسخه 522.05 باشد. علاوه بر این کارت گرافیک مورد نظر نیز باید پشتیبانی گردد. همچنین نسخه پایتونی که از CUDA 11.8 پیشتیبانی میکند نسخه 3.11.1 میباشد. توجه به نسخه بسیار حائز اهمیت است.
برای مشاهده کارت گرافیک در ویندوز میتوان از دستور زیر استفاده کرد:
wmic path win32_VideoController get name, driverversion
همچنین با استفاده از WIN+R و دستور dxdiag میتوان کارت گرافیک و ورژن درایور را مشاهده کرد.
برای مشاهده ورژن و بررسی نصب CUDA میتوان از دستور زیر استفاده کرد:
nvcc --version
مدل های مختلف را نیز میتوان از HuggingFace دانلود کرد.
با توجه به نیاز به کامپایل llama.cpp نیاز است Visual Studio را برای استفاده از Desktop Development c++ نصب کنیم.
ابتدا llama.cpp را از لینک زیر دانلود میکنیم
https://github.com/ggml-org/llama.cpp
سپس با استفاده از دستور زیر عملیات بیلد را انجام میدهیم:
cd llama cmake -B build cmake --build build --config Release
برای استفاده از GPU در حین کامپایل باید فلگ DLLAMA_CUBLAS ست شود در غیر این صورت مدل بر روی CPU اجرا خواهد شد:
cmake -DLLAMA_CUBLAS=on
در خروجی یک فایل با نام main.exe ایجاد میشود و براحتی میتوان مدل GGUF را بصورت زیر اجرا کرد:
.\main.exe -m .\models\mistral-7b-instruct-v0.2.Q4_K_M.gguf -p "Hello, How are you?"
برای اجرای آفلاین ابتدا باید پکیج های مورد نیاز را دانلود کرد:
mkdir offline_for_llama # download llama-cpp for python pip download llama-cpp-python -d offline_for_llama pip download "scikit-build-core[pyproject]>=0.9.2" -d offline_for_llama pip download "cmake>=3.21" -d offline_for_llama
سپس در سیستم مقصد نصب میکنیم(در صورت عدم نیاز به انتقال فایل به سیستم افلاین میتوانیم مستقیم بدون دانلود با دسترسی به اینترنت پکیج ها را نصب کنیم):
pip install --no-index --find-links=offline_for_llama llama-cpp-python
پس از نصب با یک نمونه کد ساده پایتون میتوان مدل را اجرا کرد:
from llama_cpp import Llama def test_llama(): model_path = ".\mistral-7b-instruct-v0.2.Q4_K_M.gguf" llama = Llama(model_path=model_path) prompt = "Hello, how are you?" output = llama(prompt=prompt, max_tokens=50) print(prompt) print("Output:\n", output['choices'][0]['text']) if __name__ == "__main__": test_llama()
ابتدا باید مدل مورد نظر را دانلود کرد. برای راحتی میتوان با اسکریپت زیر و وارد کردن نام مدل، پکیج کامل مدل را دانلود کرد:
import os os.environ["TRANSFORMERS_NO_FLASH_ATTN"] = "1" from transformers import GPT2LMHeadModel, GPT2Tokenizer model_name = "gpt2" save_dir = "./offline_package_gpt2" model = GPT2LMHeadModel.from_pretrained(model_name) model.save_pretrained(save_dir) tokenizer = GPT2Tokenizer.from_pretrained(model_name) tokenizer.save_pretrained(save_dir)
سپس باید کتابخانه های مورد نیاز برای استفاده از PyTorch را دانلود و نصب کرد(ورژن torch باید با ورژن CUDA مطابقت داشته باشد همچنین مانند قبل در صورت عدم نیاز به دانلود و انتقال به سیستم افلاین، میتوان مستقیم پکیج ها را نصب کرد):
mkdir offline_packages pip download torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 -d offline_packages pip download transformers tokenizers accelerate --no-deps -d offline_packages pip download regex tqdm requests numpy --dest offline_packages pip download "huggingface-hub<1.0,>=0.16.4" -d offline_packages pip download "safetensors>=0.4.3" -d offline_packages pip download psutil -d offline_packages pip install --no-index --find-links=. torch torchvision torchaudio pip install --no-index --find-links=offline_packages regex tqdm requests numpy pip install --no-index --find-links=offline_packages tokenizers pip install --no-index --find-links=offline_packages transformers accelerate
برای اطمینان از نصب PyTorch و همچنین دسترسی به CUDA برای اجرا بر روی GPU باید از اسکریپت زیر استفاده کرد:
import torch # test -> pytorch installed print(" PyTorch version:", torch.__version__) # test -> cuda installed print(" CUDA available:", torch.cuda.is_available()) # test -> pytorch detect gpu and can access to gput if torch.cuda.is_available(): print(" GPU name:", torch.cuda.get_device_name(0)) print(" Current device:", torch.cuda.current_device()) # run a simple task o gpu x = torch.rand(3, 3).cuda() print(" Tensor on GPU:\n", x) else: print(" CUDA is NOT available. Using CPU.")
پس از اطمینان از نصب، برای اجرای مدل دانلود شده میتوان از کد زیر استفاده کرد:
import torch from transformers import GPT2LMHeadModel, GPT2Tokenizer if not torch.cuda.is_available(): raise RuntimeError("GPU not available.") device = torch.device("cuda") model_path = ".\offline_package_gpt2" tokenizer = GPT2Tokenizer.from_pretrained(model_path) model = GPT2LMHeadModel.from_pretrained(model_path).to(device) model.eval() input_text = "The meaning of life is" inputs = tokenizer(input_text, return_tensors="pt") inputs = {k: v.to(device) for k, v in inputs.items()} with torch.no_grad(): output_ids = model.generate( **inputs, max_length=50, do_sample=True, temperature=0.8, top_p=0.95, num_return_sequences=1 ) generated_text = tokenizer.decode(output_ids[0], skip_special_tokens=True) print(generated_text)
در این مقاله سعی شد بطور ساده برخی از مفاهیم و ابزارهای مورد نیاز برای اجرای مدل های زبانی بصورت لوکال توضیح داده شود و همچنین چند مثال کوتاه در این خصوص زده شد. در آینده این مقاله با روش ها و توضیحات بیشتر بروز خواهد شد!