Написание кода — это одно, а фактическое развертывание, чтобы кто-то мог использовать совершенно другую и крутую вещь. Это действительно так приятно, когда конвейер построен, чтобы на самом деле проверить его. Недавно я пытался использовать pytesseract для преобразования текста в изображение. Это довольно просто и понятно. Мне всегда было любопытно, что такое развертывание, я давно этим не занимался. Итак, я пошел дальше и попытался развернуть простой код Python, который действует как простая модель OCR. Все это время я следил за этой статьей и документацией fastAPI. Тем не менее, я подумал, что было бы действительно полезно переписать, сделав акцент на решении проблем, с которыми я столкнулся.

Я упомянул здесь детали конфигурации инстанса, просто чтобы упростить его, а также меню AWS немного изменилось с тех пор, как была опубликована статья, на которую я ссылался.

Нажмите «Запустить экземпляр».

Теперь мы настроим EC2 на операционную систему, в которой мы хотим его запустить.

Все вышеперечисленные конфигурации были настроены с параметрами, которые подходят для уровня бесплатного пользования, у AWS есть 12-месячный доступ к бесплатному уровню, с которым здорово поиграть и делать интересные вещи, вы должны проверить это на ура!

Вам необходимо создать пару ключей, она используется при подключении к экземпляру EC2 через вашу систему. Я лично хотел SSH, потому что это просто и удобно с точки зрения подключения, потому что я могу просто использовать SSH через командную строку. Однако вы можете создать пару ключей по своему усмотрению.

После настройки экземпляра нам нужно настроить входящие правила. Для настройки ролей входящего трафика перейдите на панель инструментов групп безопасности, используя параметры поиска в консоли AWS, как мы перешли в меню EC2.

Установите флажок в группе безопасности, соответствующей вновь созданному экземпляру EC2.

Как только мы это сделаем, мы увидим меню внизу экрана следующим образом:

Нам нужно добавить правило HTTP, чтобы наш код мог работать через порт 80 по HTTP.

Теперь почти пришло время для действительно захватывающих вещей, но перед этим нам нужно подключиться к нашему экземпляру EC2.

Мы можем подключиться к нашему экземпляру через командную строку (я использую Windows, поэтому команды могут немного отличаться, если вы используете другую операционную систему).

ssh -i your_keypair_filename.pem ubuntu@your_EC2_instance's_IPV4

Как только вы это сделаете, вы будете подключены к вашему экземпляру EC2.

Мы должны настроить среду, установив все зависимости.

#finding out the version the current symlink is pointing to
python3 --version
#Removing the current symlink if its not pointing to the version we #want
sudo rm /usr/bin/python3
#Installing the required version of python
sudo apt-get install python3.8
#Updating the symlink
sudo ln -s /usr/bin/python3.8 /usr/bin/python

Ниже приведена часть, где я столкнулся со многими проблемами. Инстансы EC2 поставляются с предустановленными версиями Python, обычно 2.7 и 3.6. Нужные нам библиотеки могут быть несовместимы с имеющимися версиями. Итак, нам нужно установить нужную версию python, в моем случае python 3.8 и сменить на нее симлинк python3. Это то, с чем имеет дело приведенный выше фрагмент.

sudo apt-get update
sudo apt install python3-pip
sudo apt-get install libsm6 libxrender1 libfontconfig1 libice6 nginx gunicorn
pip3 install numpy==1.21.1 fastapi==0.54.1 starlette==0.13.2 opencv-python-headless==4.1.2.30 pytesseract==0.3.3 matplotlib==3.3.1 pydantic==1.4 uvicorn==0.11.3 gunicorn==20.0.4 python-multipart==0.0.5
#If you are facing an issue with the above uninstall and reinstall #apt
sudo apt update
sudo apt install tesseract-ocr
sudo apt install libtesseract-dev

Время развертывания

Это простой код для выполнения OCR, мы используем fastAPI для защиты входного изображения, его обработки и возврата результата. (Это было взято непосредственно из статьи, основная цель этой статьи — подчеркнуть и помочь решить проблемы, с которыми я столкнулся во время развертывания).

#save the file as test.py
import numpy as np
import sys, os
from fastapi import FastAPI, UploadFile, File
from starlette.requests import Request
import io
import cv2
import pytesseract
from pydantic import BaseModeldef read_img(img):
 text = pytesseract.image_to_string(img)
 return(text)
 
app = FastAPI()class ImageType(BaseModel):
 url: str@app.post(“/predict/”) 
def prediction(request: Request, 
 file: bytes = File(…)):if request.method == “POST”:
 image_stream = io.BytesIO(file)
 image_stream.seek(0)
 file_bytes = np.asarray(bytearray(image_stream.read()), dtype=np.uint8)
 frame = cv2.imdecode(file_bytes, cv2.IMREAD_COLOR)
 label = read_img(frame)
 return label
 return “No post request found”

Создайте каталог для хранения кода Python в вашем экземпляре EC2.

mkdir pythond
#Move into the directory
cd pythond

Перенесите этот код Python в экземпляр EC2 с помощью следующей команды:

#Navigate to the directory where your python file is present in the #system you're using to connect with EC2 and 
#use the following command to transfer the 
scp -i ~\path\your_keypair_filename.pem test.py ubuntu@your_instance's_Public_ipv4_DNS:~/pythond/

Настройка сервера nginx — следующий шаг

#Come back to the home directory and follow the below
cd /etc/nginx/sites-enabled/
sudo vim myApp

Нам нужно добавить следующее в файл myApp, обязательно замените IP-адрес на свой ipv4.

server{
       listen 80;
       server_name your_EC2_instance's_IPV4;
       location / {
                   proxy_pass http://127.0.0.1:8000;
                  }
       }

Как только это будет сделано, просто перезапустите nginx, чтобы изменения отразились. После этого сервер будет запущен.

sudo service nginx restart
#return to the home directory
cd PythonDir
gunicorn -w 1 -k uvicorn.workers.UvicornWorker pythoncode:app

Если вы столкнулись с какими-либо ошибками, вы можете просмотреть журнал с помощью команды ниже:

#This command will kill the port 8000 which in most cases fixes the #problem
sudo fuser -k 8000/tcp

http://ваш_экземпляр_EC2_IPV4/docs

Попробуйте выполнить, загрузив приведенный ниже образец изображения:

Это так весело, когда ты на самом деле пробуешь это сам. Развертывание — это то, что делает код осмысленным и имеет смысл в большинстве сценариев. Кроме того, это расширяет базу пользователей, которые могут использовать код.

Подписание,

Шри

Скоро вернемся с большим количеством контента!