برنامه نویسی

Llama 3.2 در Lambda – DEV Community

Summarize this content to 400 words in Persian Lang
Llama 3.2 1B یک مدل هوش مصنوعی سبک وزن است که آن را برای برنامه های بدون سرور جالب می کند زیرا می توان آن را نسبتاً سریع بدون نیاز به شتاب GPU اجرا کرد.

ما از مدل‌هایی از Hugging Face و Nitric برای نشان دادن استفاده از آن و مدیریت زیرساخت‌های اطراف، مانند مسیرهای API و استقرار، استفاده خواهیم کرد.

پیش نیازها

راه اندازی پروژه

بیایید با ایجاد یک پروژه جدید با استفاده از قالب شروع پایتون Nitric شروع کنیم.

nitric new llama py-starter
cd llama

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در مرحله بعد، بیایید وابستگی های پایه را نصب کنیم، سپس وابستگی های اضافی را که به طور خاص برای بارگذاری مدل زبان نیاز داریم، اضافه می کنیم.

# Install the base dependencies
uv sync
# Add the llama-cpp-python dependency
uv add llama-cpp-python

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مدل لاما را انتخاب کنید

Llama 3.2 در اندازه‌ها و پیکربندی‌های مختلف موجود است که هر کدام از نظر عملکرد، دقت و منابع مورد نیاز، معاوضه‌های خاص خود را دارند. برای برنامه های بدون سرور بدون شتاب GPU، مانند AWS Lambda، مهم است که مدلی را انتخاب کنید که سبک و کارآمد باشد تا اطمینان حاصل شود که در محدودیت های آن محیط اجرا می شود.

ما از یک نسخه کوانتیزه شده از مدل سبک وزن Llama 1B، به ویژه Llama-3.2-1B-Instruct-Q4_K_M.gguf استفاده خواهیم کرد.

اگر با کوانتیزاسیون آشنایی ندارید، این تکنیکی است که اندازه و منابع مورد نیاز مدل را کاهش می‌دهد، که در مورد ما، آن را برای برنامه‌های بدون سرور مناسب می‌کند اما ممکن است بر دقت مدل تأثیر بگذارد.

تیم LM Studio چندین نسخه کوانتیزه شده Llama 3.2 1B را در Hugging Face ارائه می کند. سعی کنید نسخه‌های مختلف را امتحان کنید تا بهترین مطابق با نیازهای شما را بیابید، مانند Q5_K_M، که کمی بزرگتر است اما کیفیت بالاتری دارد.

بیایید مدل انتخاب شده را دانلود کرده و در پوشه مدل‌های پروژه خود ذخیره کنید.

لینک دانلود Llama-3.2-1B-Instruct-Q4_K_M.gguf:

mkdir models
cd models
# This model is 0.81GB, it may take a little while to download
curl -OL https://huggingface.co/bartowski/Llama-3.2-1B-Instruct-GGUF/resolve/main/Llama-3.2-1B-Instruct-Q4_K_M.gguf
cd ..

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ساختار پوشه شما باید به شکل زیر باشد:

/llama
/models
Llama-3.2-1B-Instruct-Q4_K_M.gguf
/services
api.py
nitric.yaml
pyproject.toml
python.dockerfile
python.dockerfile.ignore
README.md
uv.lock

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

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

در مرحله بعد، از Nitric برای ایجاد یک API HTTP استفاده می کنیم که به شما امکان می دهد درخواست هایی را به مدل Llama ارسال کنید و خروجی را در یک پاسخ دریافت کنید. API خروجی خام را از مدل برمی گرداند، اما شما می توانید آن را به دلخواه تنظیم کنید.

محتویات را جایگزین کنید services/api.py با کد زیر که مدل Llama را بارگذاری کرده و عملکرد سریع را پیاده سازی می کند. برای درک کد کمی زمان بگذارید. یک API را با یک نقطه پایانی / prompt تعریف می کند که یک درخواست POST را با یک درخواست در بدنه می پذیرد. این process_prompt تابع دستور را به مدل Llama می فرستد و پاسخ را برمی گرداند.

from nitric.resources import api
from nitric.application import Nitric
from nitric.context import HttpContext
from llama_cpp import Llama

# Load the locally stored Llama model
llm = Llama(model_path=”./models/Llama-3.2-1B-Instruct-Q4_K_M.gguf”)

# Function to execute a prompt using the Llama model
def process_prompt(user_prompt):
system_prompt = “You are a helpful assistant.”

# See https://www.llama.com/docs/model-cards-and-prompt-formats/llama3_1/ for details about prompt format
prompt = (
# System Prompt
f'<|start_header_id|>system<|end_header_id|>{system_prompt}<|eot_id|>’
# User Prompt
f'<|start_header_id|>user<|end_header_id|>{user_prompt}<|eot_id|>’
# Start assistants turn (we leave this open ended as the assistant hasn’t started its turn)
f'<|start_header_id|>assistant<|end_header_id|>’
)

response = llm(
prompt=prompt,
# Unlimited, consider setting a token limit
max_tokens=-1,
temperature=0.7,
)

return response

# Define an API for the prompt service
main = api(“main”)

@main.post(“/prompt”)
async def handle_prompt(ctx: HttpContext):
# assume the input is text/plain
prompt = ctx.req.data

try:
ctx.res.body = process_prompt(prompt)
except Exception as e:
print(f”Error processing prompt: {e}”)
ctx.res.body = {“error”: str(e)}
ctx.res.status = 500

Nitric.run()

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خوب، بیایید این کار را اجرا کنیم!

اکنون که یک API تعریف کرده اید، می توانیم آن را به صورت محلی آزمایش کنیم. الگوی شروع پایتون از python3.11-bookworm-slim به عنوان تصویر محفظه اصلی خود استفاده می کند که وابستگی مناسبی برای بارگذاری مدل Llama ندارد. اجازه دهید Dockerfile را به روز کنیم تا به جای آن از Python3.11-bookworm (نسخه غیر باریک) استفاده کنیم.

به روز رسانی خط 2:

FROM python:3.11-bookworm1FROM python:3.11-bookworm

به روز رسانی خط 19:

FROM python:3.11-bookworm1FROM python:3.11-bookworm

اکنون می توانیم خدمات خود را به صورت محلی اجرا کنیم:

nitric run

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

nitric run برنامه شما را در ظرفی شروع می کند که شامل وابستگی های استفاده از llama_cpp است. اگر ترجیح می دهید از نیتریک استارت استفاده کنید، باید وابستگی هایی را برای llama-cpp-python مانند CMake و LLVM نصب کنید.

پس از شروع، می توانید آن را با داشبورد Nitric تست کنید.

می‌توانید نشانی وب داشبورد را در ترمینالی که از Nitric CLI استفاده می‌کند، بیابید. به طور پیش فرض http://localhost:49152 است. یک درخواست به بدنه درخواست اضافه کنید و آن را به درخواست ارسال کنید /prompt نقطه پایانی

تصویر به اینجا می رود

استقرار در AWS

هنگامی که آماده استقرار پروژه هستید، می توانیم یک فایل پشته Nitric جدید ایجاد کنیم که AWS را هدف قرار می دهد:

nitric stack new dev aws

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

فایل پشته را به روز کنید nitric.dev.yaml با منطقه AWS مناسب و تخصیص حافظه برای مدیریت مدل.

provider: nitric/aws@1.14.0
region: us-east-1
config:
# How services will be deployed by default, if you have other services not running models
# you can add them here too so they don’t use the same configuration
default:
lambda:
# Set the memory to 6GB to handle the model, this automatically sets additional CPU allocation
memory: 6144
# Set a timeout of 30 seconds (this is the most API Gateway will wait for a response)
timeout: 30
# We add more storage to the lambda function, so it can store the model
ephemeral-storage: 1024

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

از آنجایی که ما از ارائه‌دهنده پیش‌فرض Pulumi AWS Nitric استفاده می‌کنیم، مطمئن شوید که برای استفاده از آن تنظیم شده‌اید. می‌توانید اطلاعات بیشتری در مورد نحوه راه‌اندازی ارائه‌دهنده AWS در اسناد ارائه‌دهنده Nitric AWS بیابید.

اگر می خواهید با Terraform یا ارائه دهنده ابر دیگری مستقر شوید، این نیز امکان پذیر است. می توانید اطلاعات بیشتری در مورد نحوه استقرار Nitric در سایر پلتفرم ها در اسناد ارائه دهندگان Nitric پیدا کنید.

سپس می توانید با استفاده از دستور زیر مستقر شوید:

nitric up

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

به نشانی وب نقطه پایانی API که پس از تکمیل استقرار خروجی می‌شود، توجه داشته باشید.

اگر بعداً پروژه را تمام کردید، آن را خراب کنید nitric down.

تست روی AWS

برای آزمایش این سرویس، می‌توانید از هر ابزار تست API که دوست دارید، مانند cURL، Postman و غیره استفاده کنید. در اینجا یک مثال با استفاده از cURL آورده شده است:

curl -X POST {your endpoint URL here}/prompt -d “Hello, how are you?”

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

پاسخ نمونه

پاسخ شامل نتایج، به علاوه سایر ابرداده ها خواهد بود. خروجی را می توان در آرایه انتخاب یافت.

{
“id”: “cmpl-61064b38-45f9-496d-86d6-fdae4bc3db97”,
“object”: “text_completion”,
“created”: 1729655327,
“model”: “./models/Llama-3.2-1B-Instruct-Q4_K_M.gguf”,
“choices”: [
{
“text”: “\”I’m doing well, thank you for asking. I’m here and ready to assist you, so that’s a good start! How can I help you today?\””,
“index”: 0,
“logprobs”: null,
“finish_reason”: “stop”
}
],
“usage”: {
“prompt_tokens”: 26,
“completion_tokens”: 33,
“total_tokens”: 59
}
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خلاصه

همانطور که در مثال کد مشاهده کردید، ما یک ساختار اعلان نسبتاً ابتدایی تنظیم کرده‌ایم، اما می‌توانید این ساختار را گسترش دهید تا اعلان‌های پیچیده‌تری را شامل شود، از جمله اعلان‌های سیستمی که به محدود کردن/هدایت پاسخ‌های مدل یا حتی تعاملات پیچیده‌تر با مدل همچنین، در این مثال، ما مدل را مستقیماً به‌عنوان یک API در معرض دید قرار می‌دهیم، اما این زمان پاسخگویی را به 30 ثانیه در AWS با API Gateway محدود می‌کند.

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

Llama 3.2 1B یک مدل هوش مصنوعی سبک وزن است که آن را برای برنامه های بدون سرور جالب می کند زیرا می توان آن را نسبتاً سریع بدون نیاز به شتاب GPU اجرا کرد.

ما از مدل‌هایی از Hugging Face و Nitric برای نشان دادن استفاده از آن و مدیریت زیرساخت‌های اطراف، مانند مسیرهای API و استقرار، استفاده خواهیم کرد.

پیش نیازها

راه اندازی پروژه

بیایید با ایجاد یک پروژه جدید با استفاده از قالب شروع پایتون Nitric شروع کنیم.

nitric new llama py-starter
cd llama
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در مرحله بعد، بیایید وابستگی های پایه را نصب کنیم، سپس وابستگی های اضافی را که به طور خاص برای بارگذاری مدل زبان نیاز داریم، اضافه می کنیم.

# Install the base dependencies
uv sync
# Add the llama-cpp-python dependency
uv add llama-cpp-python
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مدل لاما را انتخاب کنید

Llama 3.2 در اندازه‌ها و پیکربندی‌های مختلف موجود است که هر کدام از نظر عملکرد، دقت و منابع مورد نیاز، معاوضه‌های خاص خود را دارند. برای برنامه های بدون سرور بدون شتاب GPU، مانند AWS Lambda، مهم است که مدلی را انتخاب کنید که سبک و کارآمد باشد تا اطمینان حاصل شود که در محدودیت های آن محیط اجرا می شود.

ما از یک نسخه کوانتیزه شده از مدل سبک وزن Llama 1B، به ویژه Llama-3.2-1B-Instruct-Q4_K_M.gguf استفاده خواهیم کرد.

اگر با کوانتیزاسیون آشنایی ندارید، این تکنیکی است که اندازه و منابع مورد نیاز مدل را کاهش می‌دهد، که در مورد ما، آن را برای برنامه‌های بدون سرور مناسب می‌کند اما ممکن است بر دقت مدل تأثیر بگذارد.

تیم LM Studio چندین نسخه کوانتیزه شده Llama 3.2 1B را در Hugging Face ارائه می کند. سعی کنید نسخه‌های مختلف را امتحان کنید تا بهترین مطابق با نیازهای شما را بیابید، مانند Q5_K_M، که کمی بزرگتر است اما کیفیت بالاتری دارد.

بیایید مدل انتخاب شده را دانلود کرده و در پوشه مدل‌های پروژه خود ذخیره کنید.

لینک دانلود Llama-3.2-1B-Instruct-Q4_K_M.gguf:

mkdir models
cd models
# This model is 0.81GB, it may take a little while to download
curl -OL https://huggingface.co/bartowski/Llama-3.2-1B-Instruct-GGUF/resolve/main/Llama-3.2-1B-Instruct-Q4_K_M.gguf
cd ..
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ساختار پوشه شما باید به شکل زیر باشد:

/llama
    /models
        Llama-3.2-1B-Instruct-Q4_K_M.gguf
    /services
        api.py
    nitric.yaml
    pyproject.toml
    python.dockerfile
    python.dockerfile.ignore
    README.md
    uv.lock
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

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

در مرحله بعد، از Nitric برای ایجاد یک API HTTP استفاده می کنیم که به شما امکان می دهد درخواست هایی را به مدل Llama ارسال کنید و خروجی را در یک پاسخ دریافت کنید. API خروجی خام را از مدل برمی گرداند، اما شما می توانید آن را به دلخواه تنظیم کنید.

محتویات را جایگزین کنید services/api.py با کد زیر که مدل Llama را بارگذاری کرده و عملکرد سریع را پیاده سازی می کند. برای درک کد کمی زمان بگذارید. یک API را با یک نقطه پایانی / prompt تعریف می کند که یک درخواست POST را با یک درخواست در بدنه می پذیرد. این process_prompt تابع دستور را به مدل Llama می فرستد و پاسخ را برمی گرداند.

from nitric.resources import api
from nitric.application import Nitric
from nitric.context import HttpContext
from llama_cpp import Llama

# Load the locally stored Llama model
llm = Llama(model_path="./models/Llama-3.2-1B-Instruct-Q4_K_M.gguf")

# Function to execute a prompt using the Llama model
def process_prompt(user_prompt):
    system_prompt = "You are a helpful assistant."

    # See https://www.llama.com/docs/model-cards-and-prompt-formats/llama3_1/ for details about prompt format
    prompt = (
        # System Prompt
        f'<|start_header_id|>system<|end_header_id|>{system_prompt}<|eot_id|>'
        # User Prompt
        f'<|start_header_id|>user<|end_header_id|>{user_prompt}<|eot_id|>'
        # Start assistants turn (we leave this open ended as the assistant hasn't started its turn)
        f'<|start_header_id|>assistant<|end_header_id|>'
    )

    response = llm(
        prompt=prompt,
        # Unlimited, consider setting a token limit
        max_tokens=-1,
        temperature=0.7,
    )

    return response

# Define an API for the prompt service
main = api("main")

@main.post("/prompt")
async def handle_prompt(ctx: HttpContext):
    # assume the input is text/plain
    prompt = ctx.req.data

    try:
        ctx.res.body = process_prompt(prompt)
    except Exception as e:
        print(f"Error processing prompt: {e}")
        ctx.res.body = {"error": str(e)}
        ctx.res.status = 500

Nitric.run()
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خوب، بیایید این کار را اجرا کنیم!

اکنون که یک API تعریف کرده اید، می توانیم آن را به صورت محلی آزمایش کنیم. الگوی شروع پایتون از python3.11-bookworm-slim به عنوان تصویر محفظه اصلی خود استفاده می کند که وابستگی مناسبی برای بارگذاری مدل Llama ندارد. اجازه دهید Dockerfile را به روز کنیم تا به جای آن از Python3.11-bookworm (نسخه غیر باریک) استفاده کنیم.

به روز رسانی خط 2:

FROM python:3.11-bookworm
1
FROM python:3.11-bookworm

به روز رسانی خط 19:

FROM python:3.11-bookworm
1
FROM python:3.11-bookworm

اکنون می توانیم خدمات خود را به صورت محلی اجرا کنیم:

nitric run
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

nitric run برنامه شما را در ظرفی شروع می کند که شامل وابستگی های استفاده از llama_cpp است. اگر ترجیح می دهید از نیتریک استارت استفاده کنید، باید وابستگی هایی را برای llama-cpp-python مانند CMake و LLVM نصب کنید.

پس از شروع، می توانید آن را با داشبورد Nitric تست کنید.

می‌توانید نشانی وب داشبورد را در ترمینالی که از Nitric CLI استفاده می‌کند، بیابید. به طور پیش فرض http://localhost:49152 است. یک درخواست به بدنه درخواست اضافه کنید و آن را به درخواست ارسال کنید /prompt نقطه پایانی

تصویر به اینجا می رود

استقرار در AWS

هنگامی که آماده استقرار پروژه هستید، می توانیم یک فایل پشته Nitric جدید ایجاد کنیم که AWS را هدف قرار می دهد:

nitric stack new dev aws
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

فایل پشته را به روز کنید nitric.dev.yaml با منطقه AWS مناسب و تخصیص حافظه برای مدیریت مدل.

provider: nitric/aws@1.14.0
region: us-east-1
config:
  # How services will be deployed by default, if you have other services not running models
  # you can add them here too so they don't use the same configuration
  default:
    lambda:
      # Set the memory to 6GB to handle the model, this automatically sets additional CPU allocation
      memory: 6144
      # Set a timeout of 30 seconds (this is the most API Gateway will wait for a response)
      timeout: 30
      # We add more storage to the lambda function, so it can store the model
      ephemeral-storage: 1024
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

از آنجایی که ما از ارائه‌دهنده پیش‌فرض Pulumi AWS Nitric استفاده می‌کنیم، مطمئن شوید که برای استفاده از آن تنظیم شده‌اید. می‌توانید اطلاعات بیشتری در مورد نحوه راه‌اندازی ارائه‌دهنده AWS در اسناد ارائه‌دهنده Nitric AWS بیابید.

اگر می خواهید با Terraform یا ارائه دهنده ابر دیگری مستقر شوید، این نیز امکان پذیر است. می توانید اطلاعات بیشتری در مورد نحوه استقرار Nitric در سایر پلتفرم ها در اسناد ارائه دهندگان Nitric پیدا کنید.

سپس می توانید با استفاده از دستور زیر مستقر شوید:

nitric up
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

به نشانی وب نقطه پایانی API که پس از تکمیل استقرار خروجی می‌شود، توجه داشته باشید.

اگر بعداً پروژه را تمام کردید، آن را خراب کنید nitric down.

تست روی AWS

برای آزمایش این سرویس، می‌توانید از هر ابزار تست API که دوست دارید، مانند cURL، Postman و غیره استفاده کنید. در اینجا یک مثال با استفاده از cURL آورده شده است:

curl -X POST {your endpoint URL here}/prompt -d "Hello, how are you?"
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

پاسخ نمونه

پاسخ شامل نتایج، به علاوه سایر ابرداده ها خواهد بود. خروجی را می توان در آرایه انتخاب یافت.

{
  "id": "cmpl-61064b38-45f9-496d-86d6-fdae4bc3db97",
  "object": "text_completion",
  "created": 1729655327,
  "model": "./models/Llama-3.2-1B-Instruct-Q4_K_M.gguf",
  "choices": [
    {
      "text": "\"I'm doing well, thank you for asking. I'm here and ready to assist you, so that's a good start! How can I help you today?\"",
      "index": 0,
      "logprobs": null,
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 26,
    "completion_tokens": 33,
    "total_tokens": 59
  }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خلاصه

همانطور که در مثال کد مشاهده کردید، ما یک ساختار اعلان نسبتاً ابتدایی تنظیم کرده‌ایم، اما می‌توانید این ساختار را گسترش دهید تا اعلان‌های پیچیده‌تری را شامل شود، از جمله اعلان‌های سیستمی که به محدود کردن/هدایت پاسخ‌های مدل یا حتی تعاملات پیچیده‌تر با مدل همچنین، در این مثال، ما مدل را مستقیماً به‌عنوان یک API در معرض دید قرار می‌دهیم، اما این زمان پاسخگویی را به 30 ثانیه در AWS با API Gateway محدود می‌کند.

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

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا