پرش به محتوا
← همهٔ یادداشت‌ها

اجرای مدل زبانی فارسی روی GPU ابری: Ollama و llama.cpp

·۷ دقیقه مطالعه·تیم جی‌پی‌یو

صفحه‌ای از یک مرقع خوشنویسی نستعلیق قاجاری با حاشیهٔ گل و پرنده روی زمینهٔ صورتی و متن طلاکوب در میانه.

اجرای مدل زبانی فارسی روی سخت‌افزار خودتان به خرید کارت گرافیک نیاز ندارد. یک ماشین GPU ابری ساعتی اجاره می‌کنید، فایل مدل را مستقیم روی همان ماشین دانلود می‌کنید و در کمتر از نیم ساعت یک مدل فارسی دارید که از ترمینال یا از کد خودتان به آن وصل می‌شوید. در این آموزش دو مسیر را کنار هم می‌بینید: Ollama برای وقتی که می‌خواهید سریع به جواب برسید، و llama.cpp برای وقتی که کنترل بیشتری روی حافظه و سرویس‌دهی می‌خواهید.

مدلی که در این راهنما اجرا می‌کنیم Dorna است؛ یک مدل هشت میلیارد پارامتری بر پایهٔ Llama 3 که روی دادهٔ فارسی آموزش دیده و نسخهٔ GGUF آن هم منتشر شده است. کل کار روی یک کارت ۱۲ گیگابایتی جا می‌شود و با نرخ‌های فعلی بازار، تمرین کردن این آموزش حدود یک ساعت وقت و در همین حدود هزینه می‌برد. اعداد دقیق قیمت را پایین‌تر می‌بینید.

پیش‌نیازها

برای شروع به سه چیز نیاز دارید: یک حساب در جی‌پی‌یو که از صفحهٔ ثبت‌نام ساخته می‌شود، کمی موجودی در کیف پول، و یک کلید عمومی SSH که در /account ثبت شده باشد. بدون کلید SSH امکان اجارهٔ ماشین نیست، چون ورود به ماشین فقط با کلید انجام می‌شود و رمز عبوری در کار نیست.

موجودی باید دست‌کم به اندازهٔ یک ساعت از نرخ همان ماشینی باشد که انتخاب می‌کنید. اگر هنوز حساب نساخته‌اید یا کلید SSH ندارید، قدم‌به‌قدمش در پست شروع اجاره GPU: اولین ماشین در ۱۰ دقیقه آمده است. شارژ کیف پول هم با کارت به کارت انجام می‌شود؛ رسید را آپلود می‌کنید و بعد از تأیید اپراتور به موجودی اضافه می‌شود.

انتخاب ماشین مناسب

اندازهٔ فایل مدل تعیین می‌کند چه کارتی لازم دارید. نسخه‌های کوانتیزه‌شدهٔ Dorna روی Hugging Face این‌طورند: فایل Q4_K_M حدود ۴٫۶ گیگابایت، فایل Q8_0 حدود ۸ گیگابایت و نسخهٔ کامل bf16 حدود ۱۵ گیگابایت. به‌جز خود فایل، چند گیگابایت هم برای حافظهٔ متن (KV cache) کنار بگذارید.

یعنی در عمل: یک کارت ۱۲ گیگابایتی برای Q8_0 کافی است و کیفیتش از نسخهٔ کامل عملاً تفاوت محسوسی ندارد. اگر می‌خواهید bf16 را بدون کوانتیزه‌سازی اجرا کنید یا متن ورودی‌تان خیلی بلند است، سراغ کارت ۲۴ گیگابایتی بروید.

در زمان نوشتن این مطلب، ارزان‌ترین پیشنهادها در بازار این‌ها بودند: RTX 3060 با ۱۲ گیگابایت از حدود ۱۶ هزار تومان در ساعت، RTX A4000 با ۱۶ گیگابایت از حدود ۲۴ هزار تومان در ساعت و RTX 3090 با ۲۴ گیگابایت از حدود ۴۲ هزار تومان در ساعت. پیشنهاد اقتصادی برای این آموزش RTX 3060 است؛ اگر می‌خواهید هم‌زمان چند درخواست را سرویس بدهید، RTX 3090 بگیرید. قیمت لحظهٔ اجاره قفل می‌شود و بعد از آن تغییر نمی‌کند. برای مقایسهٔ کلی‌تر کارت‌ها، پست انتخاب کارت گرافیک هوش مصنوعی: راهنمای VRAM هر کار را ببینید.

اجاره و راه‌اندازی

در صفحهٔ بازار کارت موردنظر را فیلتر کنید و موقع اجاره قالب را انتخاب کنید. برای مسیر اول قالب Ollama و برای مسیر دوم قالب Llama.cpp را بردارید. اگر می‌خواهید هر دو را روی یک ماشین امتحان کنید، قالب PyTorch را بگیرید و ابزارها را خودتان نصب کنید.

بعد از زدن دکمهٔ اجاره، چند دقیقه طول می‌کشد تا ماشین به حالت «آماده» برسد. آن‌وقت در صفحهٔ ماشین این‌ها را می‌بینید که همه با یک کلیک کپی می‌شوند: دستور SSH آماده، لینک Jupyter و توکن آن، دستور تونل امن برای باز کردن رابط وب از روی SSH، و فهرست پورت‌های منتشرشده. با همان دستور SSH وارد شوید و اول وضعیت کارت را ببینید:

nvidia-smi

باید نام کارت و مقدار حافظهٔ آزاد را نشان بدهد. اگر این دستور خطا داد، ماشین هنوز کامل بالا نیامده؛ یکی دو دقیقه صبر کنید و دوباره بزنید.

مسیر اول: اجرای مدل زبانی فارسی با Ollama

ابزار دانلود Hugging Face را نصب کنید و فایل GGUF را روی خود ماشین بگیرید. چون ماشین خارج از ایران است، این دانلود با سرعت گیگابیتی انجام می‌شود و به اینترنت شما ربطی ندارد؛ هشت گیگابایت معمولاً زیر دو دقیقه تمام می‌شود.

pip install -U huggingface_hub
hf download PartAI/Dorna-Llama3-8B-Instruct-GGUF \
  dorna-llama3-8b-instruct.Q8_0.gguf \
  --local-dir ~/models/dorna

حالا یک Modelfile بسازید تا Ollama بداند این فایل را چطور بالا بیاورد. توکن‌های توقف مربوط به خانوادهٔ Llama 3 هستند و اگر نباشند، مدل بعد از جواب دادن ادامه می‌دهد و متن اضافه تولید می‌کند:

cat > ~/models/dorna/Modelfile <<'EOF'
FROM ./dorna-llama3-8b-instruct.Q8_0.gguf
PARAMETER stop "<|eot_id|>"
PARAMETER stop "<|start_header_id|>"
PARAMETER stop "<|end_header_id|>"
EOF

سپس مدل را بسازید و اجرا کنید:

cd ~/models/dorna
ollama create dorna -f Modelfile
ollama run dorna "پایتخت ایران کجاست و چند نفر جمعیت دارد؟"

جواب باید فارسی و در چند جمله باشد. از این به بعد ollama run dorna یک چت تعاملی باز می‌کند و با /bye از آن بیرون می‌آیید.

اگر حوصلهٔ ساختن Modelfile را ندارید، Ollama می‌تواند فایل GGUF را مستقیم از Hugging Face بگیرد:

ollama run hf.co/PartAI/Dorna-Llama3-8B-Instruct-GGUF:Q8_0

برای اتصال از لپ‌تاپ خودتان و استفاده از API، همان روشی که در پست اجرای مدل زبانی با Ollama روی GPU ابری توضیح داده شده کار می‌کند؛ فقط نام مدل را dorna بگذارید.

مسیر دوم: سرو مدل با llama.cpp

اگر قالب Llama.cpp را گرفته‌اید، باینری‌ها آماده‌اند. اگر روی قالب دیگری هستید، ساختنش با CUDA چند دقیقه طول می‌کشد:

git clone https://github.com/ggml-org/llama.cpp
cd llama.cpp
cmake -B build -DGGML_CUDA=ON
cmake --build build --config Release -j $(nproc)

باینری‌ها در build/bin/ ساخته می‌شوند. حالا همان فایل GGUF را به llama-server بدهید:

./build/bin/llama-server \
  -m ~/models/dorna/dorna-llama3-8b-instruct.Q8_0.gguf \
  -ngl 99 -c 8192 --host 127.0.0.1 --port 8080

سوییچ -ngl 99 یعنی همهٔ لایه‌ها روی کارت گرافیک بروند و -c 8192 اندازهٔ پنجرهٔ متن است. در لاگ باید ببینید که لایه‌ها روی GPU بار شده‌اند. برای تست سریع از خود ماشین:

curl -s http://127.0.0.1:8080/v1/chat/completions \
  -H 'Content-Type: application/json' \
  -d '{"model":"dorna","messages":[{"role":"user","content":"سه جملهٔ کوتاه دربارهٔ اصفهان بنویس."}]}'

این نقطه با API سازگار با OpenAI کار می‌کند، پس هر کتابخانه‌ای که به OpenAI وصل می‌شود با عوض کردن آدرس پایه به همین سرویس وصل می‌شود. چون سرویس را روی 127.0.0.1 بالا آورده‌ایم، از بیرون در دسترس نیست؛ از لپ‌تاپ خودتان با دستور تونل امن که در صفحهٔ ماشین هست به آن وصل شوید. این امن‌ترین حالت است و پورت را روی اینترنت باز نمی‌گذارد.

مدل‌های دیگر برای فارسی

Dorna تنها گزینه نیست. مدل‌های چندزبانهٔ عمومی هم فارسی را تا حد خوبی می‌فهمند و با یک دستور در Ollama بالا می‌آیند:

ollama run qwen3:8b
ollama run gemma3:12b

این‌ها برای ترجمه، خلاصه‌سازی و پرسش‌وپاسخ عمومی فارسی جواب می‌دهند، ولی در متن‌های محاوره‌ای و اصطلاحات بومی معمولاً مدلی که اختصاصاً روی دادهٔ فارسی آموزش دیده طبیعی‌تر می‌نویسد. بهترین کار این است که هر دو را روی نمونه‌متن‌های واقعی خودتان امتحان کنید؛ چون هزینه ساعتی است، این مقایسه چند هزار تومان بیشتر خرج ندارد.

اگر به مشکل خوردید

خطای CUDA out of memory: فایل بزرگ‌تر از حافظهٔ کارت است. یک رده پایین‌تر بروید (Q8_0 به‌جای bf16، یا Q4_K_M به‌جای Q8_0) یا مقدار -c را کم کنید.

دانلود نیمه‌کاره ماند: دستور hf download را دوباره بزنید؛ از همان‌جا ادامه می‌دهد. اگر فایل خراب شد، پوشهٔ ~/models/dorna را پاک کنید و از نو بگیرید.

مدل جواب بی‌ربط یا طولانی می‌دهد: احتمالاً توکن‌های توقف تنظیم نشده‌اند. سطرهای PARAMETER stop را در Modelfile بررسی کنید و دوباره ollama create بزنید.

پورت ۸۰۸۰ باز نمی‌شود: اگر از لپ‌تاپ مستقیم امتحان می‌کنید، یادتان باشد سرویس روی 127.0.0.1 است. از دستور تونل امن صفحهٔ ماشین استفاده کنید.

خروجی فارسی به‌هم‌ریخته است: ترمینال را روی UTF-8 بگذارید؛ مشکل از مدل نیست.

هزینه و صرفه‌جویی

کل این آموزش — از اجاره تا گرفتن چند جواب — روی یک کارت ۱۲ گیگابایتی حدود یک ساعت وقت می‌برد. با نرخ RTX 3060 در زمان نوشتن این مطلب، یعنی حدود ۱۶ هزار تومان. هزینه دقیقه‌ای از کیف پول کم می‌شود و ماشین متوقف‌شده هزینه‌ای ندارد.

دو نکته که بیشترین صرفه‌جویی را می‌سازد: اول این‌که مدل را یک بار دانلود کنید و همان جلسه کارتان را تمام کنید، چون دیسک ماشین با حذف ماشین پاک می‌شود و فضای ذخیره‌سازی دائمی وجود ندارد. دوم این‌که قبل از حذف ماشین، هر خروجی یا فایل تنظیماتی که لازم دارید را دانلود کنید؛ روش‌هایش در پست دانلود مدل هوش مصنوعی روی سرور GPU: scp و rsync آمده است.

قدم بعدی

وقتی مدل فارسی روی ماشین بالا آمد، دو مسیر جلوی شماست. اگر دنبال یک رابط چت تمیز برای کار روزمره هستید، قالب Open Webui (Ollama) را بگیرید و همین مدل را در مرورگر استفاده کنید. اگر می‌خواهید مدل را به اپلیکیشن خودتان وصل کنید و چند کاربر هم‌زمان داشته باشید، سراغ قالب vLLM بروید که برای سرویس‌دهی هم‌زمان ساخته شده است.

پرسش‌های متداول

آیا مدل زبانی فارسی روی کارت گرافیک معمولی اجرا می‌شود؟

نسخهٔ کوانتیزه‌شدهٔ یک مدل هشت میلیارد پارامتری روی کارت ۱۲ گیگابایتی راحت اجرا می‌شود. اگر چنین کارتی ندارید، اجارهٔ ساعتی ارزان‌تر از خرید است و می‌توانید هر بار کارت متفاوتی بگیرید.

فرق Ollama و llama.cpp در چیست؟

Ollama یک لایهٔ راحت روی همان موتور است: مدل را با یک دستور بالا می‌آورد و مدیریت می‌کند. llama.cpp خودِ موتور است و سوییچ‌های دقیق‌تری برای حافظه، تعداد لایه‌های روی GPU و پیکربندی سرویس می‌دهد. برای شروع Ollama و برای سرویس‌دهی جدی llama.cpp.

کدام نسخهٔ GGUF را دانلود کنم؟

اگر حافظهٔ کارت اجازه می‌دهد، Q8_0 بگیرید؛ کیفیتش عملاً به نسخهٔ کامل نزدیک است و نصف جا می‌گیرد. روی کارت‌های کوچک‌تر Q4_K_M انتخاب متعادلی است.

دانلود مدل از Hugging Face روی ماشین کند نیست؟

نه. ماشین‌ها خارج از ایران هستند و دانلود روی خود ماشین با سرعت گیگابیتی انجام می‌شود. اینترنت شما فقط برای باز بودن ترمینال SSH استفاده می‌شود.

بعد از خاموش کردن ماشین، مدل می‌ماند؟

ماشین متوقف‌شده هزینه ندارد ولی با حذف ماشین، دیسک آن پاک می‌شود. فضای ذخیره‌سازی دائمی وجود ندارد، پس اگر فایل یا خروجی مهمی دارید قبل از حذف دانلودش کنید.


تصویر کاور: «Nastaliq Calligraphy Album (MS 35342) p. 07» اثر هنرمند ناشناس، از ویکی‌مدیا کامنز، مالکیت عمومی (Public domain).