یک "Google Translate" برنامه در Python 2 Cloud Run (Docker)

۱. مرور کلی

این مجموعه از آزمایشگاه‌های کد (آموزش‌های عملی و خودآموز) با هدف کمک به توسعه‌دهندگان برای درک گزینه‌های مختلفی که هنگام استقرار برنامه‌های خود دارند، ارائه شده است. در این آزمایشگاه کد، شما یاد خواهید گرفت که چگونه از API ترجمه ابری گوگل با پایتون استفاده کنید و آن را به صورت محلی اجرا کنید یا در یک پلتفرم محاسباتی بدون سرور ابری (App Engine، Cloud Functions یا Cloud Run) مستقر کنید. برنامه نمونه موجود در مخزن این آموزش را می‌توان (حداقل) به هشت روش مختلف با تنها تغییرات جزئی در پیکربندی مستقر کرد:

  1. سرور محلی Flask (پایتون ۲)
  2. سرور محلی Flask (پایتون ۳)
  3. موتور برنامه (پایتون ۲)
  4. موتور برنامه (پایتون ۳)
  5. توابع ابری (پایتون ۳)
  6. اجرای ابری (پایتون ۲ از طریق داکر)
  7. اجرای ابری (پایتون ۳ از طریق داکر)
  8. اجرای ابری (پایتون ۳ از طریق Cloud Buildpacks)

این آزمایشگاه کد بر روی استقرار این برنامه در پلتفرم(های) بولد شده بالا تمرکز دارد.

یاد خواهید گرفت که چگونه

آنچه نیاز دارید

  • یک پروژه Google Cloud با یک حساب Cloud Billing فعال
  • فلاسک برای اجرای محلی نصب شده باشد، یا یک پلتفرم محاسباتی ابری بدون محدودیت برای استقرارهای مبتنی بر ابر فعال باشد
  • مهارت‌های پایه پایتون
  • آشنایی با دستورات اولیه سیستم عامل

نظرسنجی

چگونه از این آموزش استفاده خواهید کرد؟

آن را بخوانید و تمرین‌ها را انجام دهید فقط بخونش.

تجربه خود را با پایتون چگونه ارزیابی می‌کنید؟

تازه کار متوسط ماهر

تجربه خود را در استفاده از خدمات ابری گوگل چگونه ارزیابی می‌کنید؟

تازه کار متوسط ماهر

۲. تنظیمات و الزامات

تنظیم محیط خودتنظیم

  1. وارد کنسول گوگل کلود شوید و یک پروژه جدید ایجاد کنید یا از یک پروژه موجود دوباره استفاده کنید. اگر از قبل حساب جیمیل یا گوگل ورک اسپیس ندارید، باید یکی ایجاد کنید .

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

  • نام پروژه ، نام نمایشی برای شرکت‌کنندگان این پروژه است. این یک رشته کاراکتری است که توسط APIهای گوگل استفاده نمی‌شود و شما می‌توانید آن را در هر زمانی به‌روزرسانی کنید.
  • شناسه پروژه باید در تمام پروژه‌های گوگل کلود منحصر به فرد باشد و تغییرناپذیر است (پس از تنظیم، قابل تغییر نیست). کنسول کلود به طور خودکار یک رشته منحصر به فرد تولید می‌کند؛ معمولاً برای شما مهم نیست که چیست. در اکثر آزمایشگاه‌های کد، باید به شناسه پروژه ارجاع دهید (و معمولاً با نام PROJECT_ID شناخته می‌شود)، بنابراین اگر آن را دوست ندارید، یک شناسه تصادفی دیگر ایجاد کنید، یا می‌توانید شناسه خودتان را امتحان کنید و ببینید آیا در دسترس است یا خیر. سپس پس از ایجاد پروژه، آن "منجمد" می‌شود.
  • یک مقدار سوم هم وجود دارد، شماره پروژه که برخی از APIها از آن استفاده می‌کنند. برای اطلاعات بیشتر در مورد هر سه این مقادیر به مستندات مراجعه کنید.
  1. در مرحله بعد، برای استفاده از منابع/APIهای ابری، باید پرداخت صورتحساب را در کنسول ابری فعال کنید . اجرای این آزمایشگاه کد، اگر اصلاً هزینه‌ای نداشته باشد، هزینه زیادی نخواهد داشت. برای خاموش کردن منابع به طوری که پس از این آموزش متحمل پرداخت صورتحساب نشوید، دستورالعمل‌های «پاکسازی» موجود در انتهای آزمایشگاه کد را دنبال کنید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان ۳۰۰ دلاری هستند.

۳. فعال کردن API ترجمه

فعال‌سازی APIهای ابری

در این بخش، نحوه فعال کردن APIهای گوگل را به طور کلی یاد خواهید گرفت. برای برنامه نمونه ما، API ترجمه ابری (Cloud Translation API) ، Cloud Run و Cloud Artifact Registry را فعال خواهید کرد.

مقدمه

صرف نظر از اینکه می‌خواهید از کدام API گوگل در برنامه خود استفاده کنید، باید آنها را فعال کنید . مثال زیر دو روش برای فعال کردن API Cloud Vision را نشان می‌دهد. پس از یادگیری نحوه فعال کردن یک API Cloud، می‌توانید API های دیگر را نیز فعال کنید زیرا روند کار مشابه است.

گزینه ۱: از Cloud Shell یا رابط خط فرمان شما

اگرچه فعال کردن APIها از طریق کنسول ابری رایج‌تر است، برخی از توسعه‌دهندگان ترجیح می‌دهند همه کارها را از طریق خط فرمان انجام دهند. برای انجام این کار، باید «نام سرویس» یک API را جستجو کنید. این نام شبیه یک URL است: SERVICE_NAME .googleapis.com . می‌توانید این موارد را در نمودار محصولات پشتیبانی‌شده پیدا کنید، یا می‌توانید با استفاده از API کشف گوگل، به صورت برنامه‌نویسی شده آنها را جستجو کنید.

با استفاده از این اطلاعات، با استفاده از Cloud Shell (یا محیط توسعه محلی خود که ابزار خط فرمان gcloud روی آن نصب شده است )، می‌توانید یک API را به صورت زیر فعال کنید:

gcloud services enable SERVICE_NAME.googleapis.com

برای مثال، این دستور، API مربوط به Cloud Vision را فعال می‌کند:

gcloud services enable vision.googleapis.com

این دستور App Engine را فعال می‌کند:

gcloud services enable appengine.googleapis.com

همچنین می‌توانید چندین API را با یک درخواست فعال کنید. برای مثال، این خط فرمان Cloud Run، Cloud Artifact Registry و Cloud Translation API را فعال می‌کند:

gcloud services enable artifactregistry.googleapis.com run.googleapis.com translate.googleapis.com

گزینه ۲: از کنسول ابری

همچنین می‌توانید Vision API را در API Manager فعال کنید. از Cloud Console، به API Manager بروید و Library را انتخاب کنید.

fb0f1d315f122d4a.png

اگر می‌خواهید Cloud Vision API را فعال کنید، در نوار جستجو عبارت "vision" را وارد کنید، هر چیزی که با آنچه تاکنون وارد کرده‌اید مطابقت داشته باشد، ظاهر می‌شود:

۲۲۷۵۷۸۶a۲۴f۸f۲۰۴.png

API مورد نظر برای فعال‌سازی را انتخاب کنید و روی Enable کلیک کنید:

2556f923b628e31.png

هزینه

اگرچه بسیاری از APIهای گوگل را می‌توان بدون هزینه استفاده کرد، استفاده از محصولات و APIهای گوگل کلود رایگان نیست . هنگام فعال کردن APIهای ابری، ممکن است از شما یک حساب صورتحساب فعال درخواست شود. با این حال، توجه به این نکته مهم است که برخی از محصولات گوگل کلود دارای یک سطح «همیشه رایگان» (روزانه/ماهانه) هستند که برای اعمال هزینه‌های صورتحساب باید از آن سطح فراتر بروید. در غیر این صورت، از کارت اعتباری شما (یا ابزار صورتحساب مشخص شده) هزینه‌ای کسر نخواهد شد.

کاربران باید قبل از فعال کردن هر API، به اطلاعات قیمت آن مراجعه کنند، به خصوص توجه داشته باشند که آیا سطح رایگانی دارد یا خیر، و اگر دارد، سطح آن چیست. اگر می‌خواهید API Cloud Vision را فعال کنید، صفحه اطلاعات قیمت‌گذاری آن را بررسی کنید. Cloud Vision سهمیه رایگان دارد و تا زمانی که در مجموع (در هر ماه) در محدوده آن بمانید، نباید هیچ هزینه‌ای متحمل شوید.

قیمت‌گذاری و سطوح رایگان بین APIهای گوگل متفاوت است. مثال‌ها:

محصولات مختلف گوگل قیمت‌های متفاوتی دارند، بنابراین حتماً برای این اطلاعات به مستندات API خود مراجعه کنید.

خلاصه

حالا که می‌دانید چگونه APIهای گوگل را به طور کلی فعال کنید، به API Manager بروید و Cloud Translation API، Cloud Run و Cloud Artifact Registry را فعال کنید (اگر قبلاً این کار را نکرده‌اید). مورد اول را فعال می‌کنید زیرا برنامه ما از آن استفاده می‌کند. مورد دوم را فعال می‌کنید زیرا تصاویر کانتینر ما قبل از استقرار برای شروع سرویس Cloud Run شما در آنجا ذخیره می‌شوند، به همین دلیل است که باید آن را فعال کنید. اگر ترجیح می‌دهید همه آنها را با ابزار gcloud فعال کنید، دستور زیر را از ترمینال خود صادر کنید:

gcloud services enable artifactregistry.googleapis.com run.googleapis.com translate.googleapis.com

اگرچه سهمیه ماهانه آن در صفحه خلاصه کلی سطح «همیشه رایگان» ذکر نشده است، صفحه قیمت‌گذاری API ترجمه بیان می‌کند که همه کاربران ماهانه مقدار ثابتی از کاراکترهای ترجمه شده را دریافت می‌کنند. اگر کمتر از آن آستانه باقی بمانید، هیچ هزینه‌ای از API متحمل نخواهید شد. اگر هزینه‌های مرتبط با Google Cloud دیگری وجود داشته باشد، در پایان در بخش «پاکسازی» مورد بحث قرار خواهد گرفت.

۴. کد نمونه برنامه را دریافت کنید

کد موجود در مخزن را به صورت محلی یا در Cloud Shell (با استفاده از دستور git clone ) کپی کنید، یا فایل ZIP را از دکمه سبز Code آن، همانطور که در تصویر زیر نشان داده شده است، دانلود کنید:

5cd6110c4414cf65.png

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

۵. بررسی نمونه برنامه

برنامه نمونه، یک مشتق ساده از گوگل ترنسلیت است که از کاربران می‌خواهد متنی را به انگلیسی وارد کنند و ترجمه معادل آن متن را به اسپانیایی دریافت کنند. اکنون فایل main.py را باز کنید تا ببینیم چگونه کار می‌کند. با حذف خطوط کامنت‌گذاری شده در مورد مجوز، در بالا و پایین به این شکل خواهد بود:

from flask import Flask, render_template, request
import google.auth
from google.cloud import translate

app = Flask(__name__)
_, PROJECT_ID = google.auth.default()
TRANSLATE = translate.TranslationServiceClient()
PARENT = 'projects/{}'.format(PROJECT_ID)
SOURCE, TARGET = ('en', 'English'), ('es', 'Spanish')

# . . . [translate() function definition] . . .

if __name__ == '__main__':
    import os
    app.run(debug=True, threaded=True, host='0.0.0.0',
            port=int(os.environ.get('PORT', 8080)))
  1. این ایمپورت‌ها، قابلیت‌های Flask، ماژول google.auth و کتابخانه کلاینت Cloud Translation API را به همراه دارند.
  2. متغیرهای سراسری نشان‌دهنده‌ی برنامه‌ی Flask، شناسه‌ی پروژه‌ی Cloud، کلاینت API ترجمه، «مسیر مکان» والد برای فراخوانی‌های API ترجمه و زبان‌های مبدا و مقصد هستند. در این مورد، انگلیسی ( en ) و اسپانیایی ( es ) هستند، اما می‌توانید این مقادیر را به کدهای زبان‌های دیگری که توسط Cloud Translation API پشتیبانی می‌شوند، تغییر دهید.
  3. بلوک بزرگ if در پایین، در آموزش اجرای محلی این برنامه استفاده می‌شود - این بلوک از سرور توسعه Flask برای ارائه برنامه ما استفاده می‌کند. این بخش همچنین برای آموزش‌های استقرار Cloud Run در صورتی که وب سرور در کانتینر بسته‌بندی نشده باشد، در اینجا قرار دارد. از شما خواسته می‌شود که بسته‌بندی سرور در کانتینر را فعال کنید، اما در صورتی که این مورد را نادیده بگیرید، کد برنامه به استفاده از سرور توسعه Flask برمی‌گردد. (این مشکل با App Engine یا Cloud Functions نیست زیرا آنها پلتفرم‌های مبتنی بر منبع هستند، به این معنی که Google Cloud یک وب سرور پیش‌فرض را ارائه و اجرا می‌کند.)

در نهایت، در میان main.py قلب برنامه، تابع translate() قرار دارد:

@app.route('/', methods=['GET', 'POST'])
def translate(gcf_request=None):
    """
    main handler - show form and possibly previous translation
    """

    # Flask Request object passed in for Cloud Functions
    # (use gcf_request for GCF but flask.request otherwise)
    local_request = gcf_request if gcf_request else request

    # reset all variables (GET)
    text = translated = None

    # if there is data to process (POST)
    if local_request.method == 'POST':
        text = local_request.form['text']
        data = {
            'contents': [text],
            'parent': PARENT,
            'target_language_code': TARGET[0],
        }
        # handle older call for backwards-compatibility
        try:
            rsp = TRANSLATE.translate_text(request=data)
        except TypeError:
            rsp = TRANSLATE.translate_text(**data)
        translated = rsp.translations[0].translated_text

    # create context & render template
    context = {
        'orig':  {'text': text, 'lc': SOURCE},
        'trans': {'text': translated, 'lc': TARGET},
    }
    return render_template('index.html', **context)

تابع اصلی، کار دریافت ورودی کاربر و فراخوانی API ترجمه برای انجام کارهای سنگین را انجام می‌دهد. بیایید آن را به صورت جزئی‌تر بررسی کنیم:

  1. با استفاده از متغیر local_request بررسی کنید که آیا درخواست‌ها از توابع ابری (Cloud Functions) می‌آیند یا خیر. توابع ابری (Cloud Functions ) شیء درخواست فلاسک (Flask Request ) خود را ارسال می‌کنند، در حالی که سایر توابع (که به صورت محلی اجرا می‌شوند یا در App Engine یا Cloud Run مستقر می‌شوند) شیء درخواست را مستقیماً از فلاسک دریافت می‌کنند.
  2. متغیرهای اساسی فرم را مجدداً تنظیم کنید. این کار در درجه اول برای درخواست‌های GET است زیرا درخواست‌های POST داده‌هایی دارند که جایگزین این موارد می‌شوند.
  3. اگر از نوع POST است، متن را برای ترجمه دریافت کنید و یک ساختار JSON ایجاد کنید که نشان‌دهنده‌ی الزامات فراداده‌ی API باشد. سپس API را فراخوانی کنید و اگر کاربر از کتابخانه‌ی قدیمی‌تری استفاده می‌کند، به نسخه‌ی قبلی API برگردید.
  4. صرف نظر از این، نتایج واقعی (POST) یا بدون داده (GET) را در قالب متن قالب قرار دهید و رندر کنید.

بخش بصری برنامه در فایل index.html قالب قرار دارد. این فایل، نتایج ترجمه شده قبلی (در غیر این صورت خالی) را نشان می‌دهد و به دنبال آن فرمی برای درخواست ترجمه چیزی نمایش داده می‌شود:

<!doctype html>
<html><head><title>My Google Translate 1990s</title><body>
<h2>My Google Translate (1990s edition)</h2>

{% if trans['text'] %}
    <h4>Previous translation</h4>
    <li><b>Original</b>:   {{ orig['text'] }}  (<i>{{ orig['lc'][0] }}</i>)</li>
    <li><b>Translated</b>: {{ trans['text'] }} (<i>{{ trans['lc'][0] }}</i>)</li>
{% endif %}

<h4>Enter <i>{{ orig['lc'][1] }}</i> text to translate to <i>{{ trans['lc'][1] }}</i>:</h4>
<form method="POST"><input name="text"><input type="submit"></form>
</body></html>

۶. سرویس را مستقر کنید

اکنون با اجرای این دستور، آماده‌اید تا سرویس ترجمه خود را در Cloud Run مستقر کنید:

gcloud run deploy translate --source . --allow-unauthenticated --platform managed

خروجی باید به شکل زیر باشد و شامل دستورالعمل‌هایی برای مراحل بعدی باشد:

$ gcloud run deploy translate --source . --allow-unauthenticated --platform managed
Please specify a region:
 [1] asia-east1
 [2] asia-east2
. . . (other regions) . . .
 [28] us-west4
 [29] cancel
Please enter your numeric choice:  REGION_CHOICE

To make this the default region, run `gcloud config set run/region REGION`.

Deploying from source requires an Artifact Registry repository to
store build artifacts. A repository named [cloud-run-source-deploy] in
 region [REGION] will be created.

Do you want to continue (Y/n)?

This command is equivalent to running "gcloud builds submit --pack image=[IMAGE] ." and "gcloud run deploy translate --image [IMAGE]"

Building . . . and deploying container to Cloud Run service [translate] in project [PROJECT_ID] region [REGION]
✓ Building and deploying... Done.
  ✓ Creating Container Repository...
  ✓ Uploading sources...
  ✓ Building Container... Logs are available at [https://console.cloud.google.com/cloud-build/builds/60e1b
  9bb-b991-4b4e-8d8a-HASH?project=PROJECT_NUMBER].
  ✓ Creating Revision...
  ✓ Routing traffic...
  ✓ Setting IAM Policy...
Done.
Service [translate] revision [translate-00001-xyz] has been deployed and is serving 100 percent of traffic.
Service URL: https://SVC_NAME-HASH-REG_ABBR.a.run.app

اکنون که برنامه شما به صورت جهانی در سراسر جهان در دسترس است، باید بتوانید از طریق URL حاوی شناسه پروژه خود، همانطور که در خروجی استقرار نشان داده شده است، به آن دسترسی پیدا کنید:

۱۶۹f۶edf۵f۷d۲۰۶۸.png

یه چیزی ترجمه کن تا ببینی چی میشه!

۳۱۵۵۴e۷۱cb۸۰f۱b۴.png

۷. نتیجه‌گیری

تبریک! شما یاد گرفتید که چگونه API ترجمه ابری را فعال کنید، اعتبارنامه‌های لازم را دریافت کنید و یک برنامه وب ساده را روی Python 2 Cloud Run مستقر کنید! می‌توانید اطلاعات بیشتر در مورد این استقرار را از این جدول در مخزن .

تمیز کردن

API ترجمه ابری به شما امکان می‌دهد تعداد مشخصی از کاراکترهای ترجمه شده را در هر ماه به صورت رایگان انجام دهید. App Engine نیز سهمیه رایگان دارد و همین امر در مورد Cloud Functions و Cloud Run نیز صدق می‌کند. در صورت تجاوز از هر یک از این موارد، هزینه‌هایی متحمل خواهید شد. اگر قصد دارید به codelab بعدی ادامه دهید، لازم نیست برنامه خود را خاموش کنید.

با این حال، اگر هنوز آماده رفتن به آموزش بعدی نیستید یا نگران هستید که اینترنت برنامه‌ای را که تازه مستقر کرده‌اید، کشف کند، برنامه App Engine خود را غیرفعال کنید ، عملکرد Cloud خود را حذف کنید یا سرویس Cloud Run خود را غیرفعال کنید تا از پرداخت هزینه‌ها جلوگیری کنید. وقتی آماده رفتن به آزمایشگاه کد بعدی شدید، می‌توانید آن را دوباره فعال کنید. از طرف دیگر، اگر قصد ادامه کار با این برنامه یا آزمایشگاه‌های کد دیگر را ندارید و می‌خواهید همه چیز را به طور کامل حذف کنید، می‌توانید پروژه خود را متوقف کنید .

همچنین، استقرار در یک پلتفرم محاسباتی بدون سرور Google Cloud هزینه‌های ساخت و ذخیره‌سازی کمی را متحمل می‌شود. Cloud Build همانند Cloud Storage سهمیه رایگان خود را دارد. برای شفافیت بیشتر، Cloud Build تصویر برنامه شما را می‌سازد که سپس در Cloud Container Registry یا Artifact Registry ، جانشین آن، ذخیره می‌شود. ذخیره‌سازی آن تصویر و همچنین خروجی شبکه هنگام انتقال آن تصویر به سرویس، مقداری از آن سهمیه را مصرف می‌کند. با این حال، ممکن است در منطقه‌ای زندگی کنید که چنین ردیف رایگانی ندارد، بنابراین از میزان استفاده از فضای ذخیره‌سازی خود آگاه باشید تا هزینه‌های احتمالی را به حداقل برسانید.

۸. منابع اضافی

در بخش‌های بعدی، می‌توانید مطالب خواندنی بیشتر و همچنین تمرین‌های پیشنهادی برای افزایش دانش خود از تکمیل این آموزش را بیابید.

مطالعه اضافی

حالا که کمی با API ترجمه آشنا شدید، بیایید چند تمرین دیگر برای توسعه بیشتر مهارت‌هایتان انجام دهیم. برای ادامه مسیر یادگیری، برنامه نمونه ما را طوری تغییر دهید که موارد زیر را انجام دهد:

  1. تمام نسخه‌های دیگر این آزمایشگاه کد را برای اجرای محلی یا استقرار در پلتفرم‌های محاسباتی بدون سرور Google Cloud تکمیل کنید (به مخزن README مراجعه کنید).
  2. این آموزش را با استفاده از یک زبان برنامه‌نویسی دیگر تکمیل کنید.
  3. این برنامه را طوری تغییر دهید که از زبان‌های مبدأ یا مقصد مختلف پشتیبانی کند.
  4. این برنامه را ارتقا دهید تا بتواند متن را به بیش از یک زبان ترجمه کند؛ فایل الگو را تغییر دهید تا فهرستی از زبان‌های مقصد پشتیبانی‌شده داشته باشید.

بیشتر بدانید

موتور برنامه گوگل

عملکردهای گوگل کلود

گوگل کلود ران

بسته‌های ساخت ابری گوگل، رجیستری کانتینر، رجیستری مصنوعات

ترجمه ابری گوگل و کیت یادگیری ماشین گوگل

سایر محصولات/صفحات Google Cloud

پایتون و فلاسک

مجوز

این آموزش تحت مجوز عمومی Creative Commons Attribution 2.0 منتشر شده است، در حالی که کد منبع موجود در مخزن تحت مجوز Apache 2 می‌باشد.