Temel bir "Google Çeviri" dağıtın Python 2 Cloud Run'da (Docker) uygulama

1. Genel Bakış

Bu Codelabs serisi (kendi hızınızda ilerleyebileceğiniz, uygulamalı eğitici içerikler), geliştiricilerin uygulamalarını dağıtırken kullanabilecekleri çeşitli seçenekleri anlamalarına yardımcı olmayı amaçlamaktadır. Bu codelab'de, Google Cloud Translation API'yi Python ile nasıl kullanacağınızı ve yerel olarak çalıştırmayı ya da bir Cloud sunucusuz bilgi işlem platformuna (App Engine, Cloud Functions veya Cloud Run) dağıtmayı öğreneceksiniz. Bu eğitimdeki depoda bulunan örnek uygulama, yalnızca küçük yapılandırma değişiklikleriyle (en az) sekiz farklı şekilde dağıtılabilir:

  1. Yerel Flask sunucusu (Python 2)
  2. Yerel Flask sunucusu (Python 3)
  3. App Engine (Python 2)
  4. App Engine (Python 3)
  5. Cloud Functions (Python 3)
  6. Cloud Run (Docker üzerinden Python 2)
  7. Cloud Run (Docker üzerinden Python 3)
  8. Cloud Run (Cloud Buildpacks aracılığıyla Python 3)

Bu codelab, bu uygulamayı yukarıdaki kalın yazılmış platformlara dağıtmaya odaklanır.

Aşağıdaki işlemleri yapmayı öğreneceksiniz:

Gerekenler

  • Etkin bir Cloud Faturalandırma hesabı olan Google Cloud projesi
  • Yerel olarak çalıştırılmak üzere yüklenmiş Flask veya bulut tabanlı dağıtımlar için etkinleştirilmiş bir Cloud sunucusuz bilgi işlem platformu
  • Temel Python becerileri
  • Temel işletim sistemi komutları hakkında bilgi sahibi olma

Anket

Bu eğitimi nasıl kullanacaksınız?

Okuyup alıştırmaları tamamlayın Yalnızca okuyun

Python ile ilgili deneyiminizi nasıl değerlendirirsiniz?

Acemi Orta Uzman

Google Cloud hizmetlerini kullanma deneyiminizi nasıl değerlendirirsiniz?

Acemi Orta Seviye Uzman

2. Kurulum ve şartlar

Kendine ait tempoda ortam oluşturma

  1. Google Cloud Console'da oturum açın ve yeni bir proje oluşturun veya mevcut bir projeyi yeniden kullanın. Gmail veya Google Workspace hesabınız yoksa hesap oluşturmanız gerekir.

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

  • Proje adı, bu projenin katılımcılarının görünen adıdır. Google API'leri tarafından kullanılmayan bir karakter dizesidir ve istediğiniz zaman güncelleyebilirsiniz.
  • Proje kimliği, tüm Google Cloud projelerinde benzersiz olmalıdır ve değiştirilemez (ayarlandıktan sonra değiştirilemez). Cloud Console, benzersiz bir dize otomatik olarak oluşturur. Bu dizenin ne olduğu genellikle önemli değildir. Çoğu kod laboratuvarında proje kimliğine (genellikle PROJECT_ID olarak tanımlanır) referans vermeniz gerekir. Bu kimliği beğenmezseniz rastgele başka bir kimlik oluşturun veya kendi kimliğinizi deneyip kullanılabilir olup olmadığını kontrol edin. Proje oluşturulduktan sonra ise "dondurulur".
  • Bazı API'lerin kullandığı üçüncü bir değer de vardır: Proje Numarası. Bu üç değer hakkında daha fazla bilgiyi dokümanlar bölümünde bulabilirsiniz.
  1. Ardından, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i çalıştırmak çok pahalı olmayacaktır. Bu eğiticinin dışında faturalandırılmamak için kaynakları kapatmak üzere codelab'in sonundaki "temizlik" talimatlarını uygulayın. Google Cloud'un yeni kullanıcıları 300 ABD doları değerindeki ücretsiz deneme programına uygundur.

3. Translation API'yi etkinleştirme

Cloud API'leri etkinleştirme

Bu bölümde, Google API'lerini genel olarak nasıl etkinleştireceğinizi öğreneceksiniz. Örnek uygulamamız için Cloud Translation API, Cloud Run ve Cloud Artifact Registry'yi etkinleştireceksiniz.

Giriş

Uygulamanızda kullanmak istediğiniz Google API'si etkinleştirilmiş olmalıdır. Aşağıdaki örnekte, Cloud Vision API'yi etkinleştirmenin iki yolu gösterilmektedir. Bir Cloud API'yi nasıl etkinleştireceğinizi öğrendikten sonra, benzer bir süreç izleyerek diğer API'leri de etkinleştirebilirsiniz.

1. Seçenek: Cloud Shell'den veya komut satırı arayüzünüzden

API'leri Cloud Console'dan etkinleştirmek daha yaygın olsa da bazı geliştiriciler her şeyi komut satırından yapmayı tercih eder. Bunun için API'nin "hizmet adını" aramanız gerekir. URL gibi görünür: SERVICE_NAME.googleapis.com. Bu ürünleri Desteklenen ürünler grafiğinde bulabilir veya Google Discovery API ile programatik olarak sorgulayabilirsiniz.

Bu bilgilerle Cloud Shell'i (veya gcloud komut satırı aracının yüklü olduğu yerel geliştirme ortamınızı) kullanarak bir API'yi aşağıdaki gibi etkinleştirebilirsiniz:

gcloud services enable SERVICE_NAME.googleapis.com

Örneğin, aşağıdaki komut Cloud Vision API'yi etkinleştirir:

gcloud services enable vision.googleapis.com

Bu komut, App Engine'i etkinleştirir:

gcloud services enable appengine.googleapis.com

Tek bir istekle birden fazla API'yi de etkinleştirebilirsiniz. Örneğin, bu komut satırı Cloud Run, Cloud Artifact Registry ve Cloud Translation API'yi etkinleştirir:

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

2. seçenek: Cloud Console'dan

Vision API'yi API Yöneticisi'nden de etkinleştirebilirsiniz. Cloud Console'da API Yöneticisi'ne gidin ve Kitaplık'ı seçin.

fb0f1d315f122d4a.png

Cloud Vision API'yi etkinleştirmek istiyorsanız arama çubuğuna"vision" yazmaya başlayın. Bu durumda, girdiğiniz terimlerle eşleşen tüm sonuçlar gösterilir:

2275786a24f8f204.png

Etkinleştirmek istediğiniz API'yi seçin ve Etkinleştir'i tıklayın:

2556f923b628e31.png

Maliyet

Birçok Google API'si ücretsiz olarak kullanılabilir ancak Google Cloud ürünleri ve API'lerinin kullanımı ücretlidir. Cloud API'leri etkinleştirirken etkin bir faturalandırma hesabı girmeniz istenebilir. Ancak bazı Google Cloud ürünlerinin "Her Zaman Ücretsiz" (günlük/aylık) bir katmana sahip olduğunu ve faturalandırma ücretlerine tabi olmak için bu katmanı aşmanız gerektiğini unutmayın. Aksi takdirde kredi kartınızdan (veya belirtilen faturalandırma aracından) ödeme alınmaz.

Kullanıcılar, etkinleştirmeden önce API'nin fiyatlandırma bilgilerini incelemelidir. Özellikle de ücretsiz bir katmanının olup olmadığını ve varsa ne olduğunu kontrol etmelidir. Cloud Vision API'yi etkinleştiriyorsanız fiyatlandırma bilgilerini kontrol edersiniz. Cloud Vision'un ücretsiz kotası vardır ve toplamda (her ay) kota sınırları içinde kaldığınızda herhangi bir ücret ödemeniz gerekmez.

Fiyatlandırma ve ücretsiz katmanlar, Google API'leri arasında değişiklik gösterir. Örnekler:

Farklı Google ürünleri farklı şekilde faturalandırılır. Bu nedenle, bu bilgiler için API'nizin belgelerine başvurduğunuzdan emin olun.

Özet

Genel olarak Google API'lerini nasıl etkinleştireceğinizi öğrendiğinize göre API Yöneticisi'ne gidip Cloud Translation API, Cloud Run ve Cloud Artifact Registry'yi etkinleştirin (henüz etkinleştirmediyseniz). Uygulamamız bu özelliği kullandığından ilkini etkinleştirirsiniz. Cloud Run hizmetinizi başlatmak için dağıtılmadan önce kapsayıcı görüntülerimiz burada depolandığından ikincisini etkinleştirirsiniz. Bu nedenle bu özelliği etkinleştirmeniz gerekir. Bunların tümünü gcloud aracıyla etkinleştirmeyi tercih ederseniz terminalinizden aşağıdaki komutu verin:

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

Aylık kotası genel "Her Zaman Ücretsiz" katmanı özet sayfasında listelenmese de Translation API'nin fiyatlandırma sayfasında tüm kullanıcıların aylık olarak sabit bir miktarda çevrilmiş karakter aldığı belirtilmektedir. Bu eşiğin altında kalırsanız API'den herhangi bir ödeme alınmaz. Google Cloud ile ilgili başka ödemeler varsa bunlar "Temizleme" bölümünde açıklanır.

4. Örnek uygulama kodunu alma

Kodu depoda yerel olarak veya Cloud Shell'de (git clone komutunu kullanarak) klonlayın ya da aşağıdaki ekran görüntüsünde gösterildiği gibi yeşil Kod düğmesinden ZIP dosyasını indirin:

5cd6110c4414cf65.png

Tüm hazırlıkları tamamladığınıza göre, bu eğitimde dosyaların silinmesi veya değiştirilmesi gerekeceğinden, klasörün tam bir kopyasını oluşturun. Farklı bir dağıtım yapmak istiyorsanız orijinali kopyalayarak baştan başlayabilirsiniz. Böylece, klonlamanız veya tekrar indirmeniz gerekmez.

5. Örnek uygulama turu

Örnek uygulama, kullanıcılardan İngilizce metin girmesini ve bu metnin İspanyolca eşdeğer çevirisini almasını isteyen basit bir Google Çeviri türevidir. Şimdi, işleyiş şeklini görebilmemiz için main.py dosyasını açın. Lisanslamayla ilgili yorumlanmış satırlar hariç tutularak üst ve alt kısım şu şekilde görünür:

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. İçe aktarma işlemleri Flask işlevini, google.auth modülünü ve Cloud Translation API istemci kitaplığını getirir.
  2. Global değişkenler; Flask uygulamasını, Cloud proje kimliğini, Translation API istemcisini, Translation API çağrıları için üst "konum yolunu" ve kaynak ile hedef dilleri temsil eder. Bu örnekte İngilizce (en) ve İspanyolca (es) kullanılmaktadır ancak bu değerleri Cloud Translation API tarafından desteklenen diğer dil kodlarıyla değiştirebilirsiniz.
  3. Alt kısımdaki büyük if bloğu, bu uygulamayı yerel olarak çalıştırma konulu eğitimde kullanılır. Bu blok, uygulamamızı sunmak için Flask geliştirme sunucusunu kullanır. Bu bölüm, web sunucusunun kapsayıcıya dahil edilmemesi durumunda Cloud Run dağıtımı konulu eğitimler için de buradadır. Sunucunun kapsayıcıda paketlenmesini etkinleştirmeniz istenir. Bunu gözden kaçırırsanız uygulama kodu, Flask geliştirme sunucusunu kullanmaya geri döner. (Bu, kaynak tabanlı platformlar olduğu için App Engine veya Cloud Functions ile ilgili bir sorun değildir. Yani Google Cloud varsayılan bir web sunucusu sağlar ve çalıştırır.)

Son olarak, main.py işlevinin ortasında uygulamanın kalbi olan translate() işlevi yer alır:

@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)

Birincil işlev, kullanıcı girişini alır ve ağır işleri yapmak için Translation API'yi çağırır. Bu süreci ayrıntılı olarak inceleyelim:

  1. local_request değişkenini kullanarak isteklerin Cloud Functions'dan gelip gelmediğini kontrol edin. Cloud Functions kendi Flask istek nesnesini gönderirken diğer tüm platformlar (yerel olarak çalışan veya App Engine ya da Cloud Run'a dağıtılan) istek nesnesini doğrudan Flask'tan alır.
  2. Formun temel değişkenlerini sıfırlayın. Bu, POST isteklerinde bunların yerine geçen veriler olacağından öncelikle GET istekleri içindir.
  3. POST ise çevrilecek metni alın ve API meta veri şartını temsil eden bir JSON yapısı oluşturun. Ardından, kullanıcı eski bir kitaplık kullanıyorsa API'nin önceki bir sürümüne geri dönerek API'yi çağırın.
  4. Bununla birlikte, gerçek sonuçları (POST) veya veri yokluğunu (GET) şablon bağlamında biçimlendirin ve oluşturun.

Uygulamanın görsel kısmı index.html şablon dosyasındadır. Önceden çevrilmiş sonuçları (boşsa) ve ardından çevrilecek bir metin isteyen formu gösterir:

<!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>

6. Hizmeti dağıtma

Artık şu komutu çalıştırarak çeviri hizmetinizi Cloud Run'a dağıtmaya hazırsınız:

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

Çıkış aşağıdaki gibi görünecek ve sonraki adımlar için bazı istemler sağlayacaktır:

$ 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

Uygulamanız artık dünya genelinde kullanıma sunulduğundan, dağıtım sonucunda gösterildiği gibi proje kimliğinizi içeren URL'den uygulamanıza erişebilirsiniz:

169f6edf5f7d2068.png

Nasıl çalıştığını görmek için bir metni çevirin.

31554e71cb80f1b4.png

7. Sonuç

Tebrikler! Cloud Translation API'yi nasıl etkinleştireceğinizi, gerekli kimlik bilgilerini nasıl edineceğinizi ve Python 2 Cloud Run'a basit bir web uygulaması nasıl dağıtacağınızı öğrendiniz. Bu dağıtım hakkında daha fazla bilgiyi depodaki bu tabloda bulabilirsiniz.

Temizleme

Cloud Translation API, aylık sabit bir miktarda çeviri karakterini ücretsiz olarak gerçekleştirmenize olanak tanır. App Engine'in de ücretsiz kotası vardır. Cloud Functions ve Cloud Run için de aynı durum geçerlidir. Bu sınırlardan herhangi biri aşılırsa sizden ödeme alınır. Bir sonraki kod laboratuvarına devam etmeyi planlıyorsanız uygulamanızı kapatmanız gerekmez.

Ancak henüz bir sonraki eğitime geçmeye hazır değilseniz veya yeni dağıttığınız uygulamanın internette keşfedilmesinden endişeleniyorsanız ücret ödememek için App Engine uygulamanızı devre dışı bırakın, Cloud Functions'inizi silin veya Cloud Run hizmetinizi devre dışı bırakın. Bir sonraki codelab'e geçmeye hazır olduğunuzda bu özelliği yeniden etkinleştirebilirsiniz. Öte yandan, bu uygulamaya veya diğer kod laboratuvarlarına devam etmeyecekseniz ve her şeyi tamamen silmek istiyorsanız projenizi kapatabilirsiniz.

Ayrıca, Google Cloud sunucusuz bilgi işlem platformuna dağıtım yapmak az miktarda derleme ve depolama maliyeti gerektirir. Cloud Build'in, Cloud Storage'ınkine benzer şekilde kendi ücretsiz kotası vardır. Cloud Build, daha fazla şeffaflık için uygulama görüntünüzü oluşturur. Bu görüntü daha sonra Cloud Container Registry'de veya Artifact Registry'de (Container Registry'nin halefi) depolanır. Bu görselin depolanması, kotanın bir kısmını tüketir. Bu görsel hizmete aktarılırken ağ çıkışı da kotadan pay alır. Ancak böyle bir ücretsiz katmanın bulunmadığı bir bölgede yaşıyor olabilirsiniz. Bu nedenle, olası maliyetleri en aza indirmek için depolama alanı kullanımınıza dikkat edin.

8. Ek kaynaklar

Aşağıdaki bölümlerde, bu eğitimden edindiğiniz bilgileri geliştirmek için ek okuma materyallerinin yanı sıra önerilen alıştırmaları bulabilirsiniz.

Ek çalışma

Translation API ile ilgili biraz deneyime sahip olduğunuza göre, becerilerinizi daha da geliştirmek için bazı ek alıştırmalar yapalım. Öğrenim rotanıza devam etmek için örnek uygulamamızı aşağıdaki işlemleri yapacak şekilde değiştirin:

  1. Yerel olarak çalıştırmak veya Google Cloud sunucusuz bilgi işlem platformlarına dağıtmak için bu kod laboratuvarının diğer tüm sürümlerini tamamlayın (repo README bölümüne bakın).
  2. Bu eğitimi başka bir programlama dili kullanarak tamamlayın.
  3. Bu uygulamayı farklı kaynak veya hedef dilleri destekleyecek şekilde değiştirin.
  4. Metni birden fazla dile çevirebilmek için bu uygulamayı yükseltin; şablon dosyasını, desteklenen hedef dillerin açılır menüsüne sahip olacak şekilde değiştirin.

Daha fazla bilgi

Google App Engine

Google Cloud Functions

Google Cloud Run

Google Cloud Buildpacks, Container Registry, Artifact Registry

Google Cloud Translation ve Google ML Kit

Diğer Google Cloud ürünleri/sayfaları

Python ve Flask

Lisans

Bu eğitim, Creative Commons Attribution 2.0 Genel Amaçlı Lisans ile lisanslanmıştır. Depodaki kaynak kod ise Apache 2 ile lisanslanmıştır.