78 Matching Annotations
  1. Nov 2024
    1. Deploying Machine Learning Models with Flask and AWS Lambda: A Complete Guide

      In essence, this article is about:

      1) Training a sample model and uploading it to an S3 bucket:

      ```python from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression import joblib

      Load the Iris dataset

      iris = load_iris() X, y = iris.data, iris.target

      Split the data into training and testing sets

      X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

      Train the logistic regression model

      model = LogisticRegression(max_iter=200) model.fit(X_train, y_train)

      Save the trained model to a file

      joblib.dump(model, 'model.pkl') ```

      1. Creating a sample Zappa config, because AWS Lambda doesn’t natively support Flask, we need to use Zappa, a tool that helps deploy WSGI applications (like Flask) to AWS Lambda:

      ```json { "dev": { "app_function": "app.app", "exclude": [ "boto3", "dateutil", "botocore", "s3transfer", "concurrent" ], "profile_name": null, "project_name": "flask-test-app", "runtime": "python3.10", "s3_bucket": "zappa-31096o41b" },

      "production": {
          "app_function": "app.app",
          "exclude": [
              "boto3",
              "dateutil",
              "botocore",
              "s3transfer",
              "concurrent"
          ],
          "profile_name": null,
          "project_name": "flask-test-app",
          "runtime": "python3.10",
          "s3_bucket": "zappa-31096o41b"
      }
      

      } ```

      1. Writing a sample Flask app:

      ```python import boto3 import joblib import os

      Initialize the Flask app

      app = Flask(name)

      S3 client to download the model

      s3 = boto3.client('s3')

      Download the model from S3 when the app starts

      s3.download_file('your-s3-bucket-name', 'model.pkl', '/tmp/model.pkl') model = joblib.load('/tmp/model.pkl')

      @app.route('/predict', methods=['POST']) def predict(): # Get the data from the POST request data = request.get_json(force=True)

      # Convert the data into a numpy array
      input_data = np.array(data['input']).reshape(1, -1)
      
      # Make a prediction using the model
      prediction = model.predict(input_data)
      
      # Return the prediction as a JSON response
      return jsonify({'prediction': int(prediction[0])})
      

      if name == 'main': app.run(debug=True) ```

      1. Deploying this app to production (to AWS):

      bash zappa deploy production

      and later eventually updating it:

      bash zappa update production

      1. We should get a URL like this:

      https://xyz123.execute-api.us-east-1.amazonaws.com/production

      which we can query:

      curl -X POST -H "Content-Type: application/json" -d '{"input": [5.1, 3.5, 1.4, 0.2]}' https://xyz123.execute-api.us-east-1.amazonaws.com/production/predict

  2. Nov 2023
  3. Jul 2023
    1. Modern web

      این Routing در واقع برای map کردن یک HTTP Request به یک Function است. مثل اینکه این Routing میتونن به انواع و اقسام HTTP Requst جواب بدن مثل GET و POST و غیره. در واقع در نهایت یک Routing Table درست میشه که هر URL به یک تیکه کدی وصل می کنه و به این Routing Table یا Routing Engine کفته می شود.(یاد مفهوم Routing Table در لایه 3 یا network افتادم)

      برای status code می تونی بعد اون return سااده بنویسی 200 return "Would you like some tea?", 200

    1. requests

      در واقع تعیین می کنه که درخواست ها از چه پروتکلی، با چه IP یا Domain Name و رو چه Port می تونی جواب بدی. خیلی خووبه براش تعیین کنی تو فقط باید از این IP و Port که در Front تعیین کردی استفاده کنی

    1. url_for

      من تا الان همچین تابعی ندیده بودم. فقط اسم اون url را میده. build a URL dynamically بعضی وقتا می خوای بر اساس ورودی کاربر به url های مختلفی اون را بفرستی که برای این کار از url_for استفاده می کنند. هر چی پارامتر بعد بهش بدی میشه در واقع همون پارامترهای اون تابع: url_for('cricket',favteam = team) مثالش اینجاس: https://www.geeksforgeeks.org/flask-url-helper-function-flask-url_for/

    2. redirect()

      که خب برای وقتایی هست که تو میخوای در یک تابعی هستی و درخواست را بفرستی برای یک تابع دیگه کخ اون Handle کنه. مثلا وقتی User و Pass نداره بره تو صفحه Signup. سه تا پارامتر میگیره شامل location که آدرسی که میخواد نتیجه بره و statuscode که خب طبیعتا 302 است و response نفهمیدم.

    1. return resp

      همیشه برای Return شدن میومدیم از render_template استفاده می کردیم ولی ایندفعه کار باحالی کرده و با make_response این کار را کرده. چه جالب اینجوری Set می کنه. دقت داشته باش که با این make response میشه خیلی کارا کرد از جمله Set کردن Status Code برای Response و mimetype و headers.

      • myResponse = make_response('Response')
      • myResponse.headers['customHeader'] = 'This is a custom header'
      • myResponse.status_code = 403
      • myResponse.mimetype = 'video/mp4'
    2. Read

      برای Set شدن باید از سمت Server بیاد و برای Get شدن باید از سمت Client بیاد. برای Get کردنم که همون طور که میدونی خود مرورگر Client برات تو همون درخوسات های Get برات این Cookie را هم میفرسته

    3. In Flask

      برای Set شدن باید از سمت Server بیاد و برای Get شدن باید از سمت Client بیاد. همون جور که میدونی برای برای درست کردن response ا دستوری به نام make_response() استفده می کنیم . تو این دستور از تابعی به نام set_cookie استفاده می کنیم که میره برات یک Cookie را ذخیره می کنه.

    4. client’s computer

      اقا این Cookie همون جور که می دونی به عنوان بخشی از پروتکل http کار می کند و برای ذخیره کردن اطلاعات کاربر به کار می رود. من تو Onenote برات نوشتم. برای دسترسی به Cookie ها، داخل Request Object می تونی با attr به نام cookie بهش دسترسی داشته باشی. یک سری Extra Date داره.

    1. ven belo

      اقا دقت کن که من form در یک جلسه قبل گفتم حالا اومده تو صفحه student.html یک فرم گذاشته که تو فرمش گفته بفرس به result (البته من تو digital occean خوندم که باید بفرسته به همون جایی که ازش form را گرفته و این برام عحیبه) به هر حال در result گفته با post بگیر و اطلاعات را از طریق request.form بگیر و حالا با صفحه result اون اطلاعات را به کاربر نشون بده. خیلی ساده و قشنگ

    1. s:

      قوانین تبدیل JSON به Python dict: اولا اگر در Json حالت Key و Value داشته باشد، در پایتون به صورت Dictionary است. دوما آرایه در Json به List در پایتون تبدیل می شود. سوما Value هایی که داخل " " باشد به Sting در پایتون تبدیل می شود. چهارما باحاله نگاه کن :) پنجما اعدادی که " " نداشته باشد به اعداد تبدیل می شود.

    2. The most important thing to know about this form is that it performs a POST request to the same route that generated the form.

      این فرم POST Request را میفرسته به همون URL که این Form را Generate کرده. دقتم داشته باش که این فیلد ها را بعدا میشه در Object به نام Form گرفت و اسمشم همونایی که در Attribute به نام name گذاشتیم که اینجا language و Framework است

    3. reques

      دو جورمیاد اون Query String را میگیره request.args.get request.args حس می کنم که این args یک Array است دقت داشته باش که language یک کلید است و با این دستور میاد محتوا را میگیره. در صورتی request.args.get که حتی اگر language هم خالی باشه بازم مشکلی در اجرای برنامه پیش نمیاد، البته اگه برنامه تو اینا Handle کنه و مقدار خروجی اش برابر None است. در صورتی که request.args بخوای بری اگر نداشته باشه بهت خطای 400 میده.

    1. static file su

      اینجا تو بحث Static فایل ها است که مثل JS و CSS است. میگه به صورت عمومی این کار Web Server است ولی در موقع Develope باید این فایل ها را در پوشه Static بذاریم.

    2. A special endpoint ‘static’ is used to generate URL for static files.

      خیلی جالبه میگه فقط با گفتن کلید واژه static خودش برات URL دسترسی به این پوشه را درست می کنه. الان تو مثالشم ببینی میاد با یه url_for() و یک کلید واژه static و اسم فایل، اون فایل را برات Serve می کنه

    1. ro

      ببین من خیلی با اینجاش دیگه موافق نیستم چون تو Return به جای یک عبارت ساده، میاد یه HTML می نویسه و این هر جوری حساب کنی تخمیه و ما نباید اینجوری بریمو باید Json پس بده. این روش کلا اشتباس

    1. request

      اول همه باید خیلی خوووب دید داشته باشی نسبت به Request و Response در موقع درخواست POST. این جا از یک ابجکت جدید رونمایی کرد به نام request و در موقع پست توی request اطلاعات ارسالی است(دقت داشته باش که توی body اون اطالاعات ارسالی است) و تو Response حالا 200 می تونه باشه(مجیدی دوباره اطلاعات ارسالی را پس میفرستاد)

    1. dynamically building a URL

      با این تابع که بهش میگن url_for میشه یک تابع دیگه را اجرا کنی. توی اولین ارگومانش اسم تابعی که باید Redirect بشه را میدی و توی آزگومان های بعدی در واقع باید همون Variable Rule یا Variable Name ها را بدی

    1. variable parts

      بخ این که میان یه URL را به تابع وصل می کنند میگن Rule یا URL RULES(مثل همین چیزهایی که در iptables است) به این کاری که ما داریم اینجا انجام میدیم میگن Variable Rule به اون که داخل پرانتزه میگن Parameter به اون چیزی که داخل < > است نیگن Variable Name * نکته مهم این است که باید حواست باشه که اسم Variable Name با اسم اونی که تو تابع میده یکی است

  4. Jun 2023
    1. The add_url_rule() fu

      البته میگه یه جور دیگه هم این را گفت و اونم اینکه با متدی به نام add_url_rule این URL را به این تابع وصل کنی

    1. app.run

      این متد هم ماله Flask و توش میتونی host که ما اینجا 127.0.0.1 است. نمیدونم این 0.0.0.0 به چه دردی میخوره. اون پورت که به صورت پیش فرض برابر 5000 است. اون Debug باید فعال کنی و Option که برو بعدا ببین به چه دردی میخوره.

    2. route() function of the Flask class is a decorator

      این @app.route یه Decorator است یعنی میاد روی سر یک Function و یک سری عملکرد اون را افزایش می دهد. مثل همون مثال که زد و Log انداخت و اینا.

    1. templating engine

      اینم یک template engine کامل است که خب اومده بین کد های html ، از certain data source برای رندر شدن Dynammic Web Pages استفاده می کند.

  5. Feb 2021
    1. When we are providing our API endpoint to frontend team we need to ensure that we don’t overwhelm them with preprocessing technicalities.We might not always have a Python backend server (eg. Node.js server) so using numpy and keras libraries, for preprocessing, might be a pain.If we are planning to serve multiple models then we will have to create multiple TensorFlow Serving servers and will have to add new URLs to our frontend code. But our Flask server would keep the domain URL same and we only need to add a new route (a function).Providing subscription-based access, exception handling and other tasks can be carried out in the Flask app.

      4 reasons why we might need Flask apart from TensorFlow serving

    1. The most common way to deploy a trained model is to save into the binary format of the tool of your choice, wrap it in a microservice (for example a Python Flask application) and use it for inference.

      Model as Code <--- the most common way of deploying ML models

  6. Oct 2020
  7. Jun 2020
    1. The philosophy behind Flask is that it gives only the components you need to build an app so that you have the flexibility and control. In other words, it’s un-opinionated. Some features it offers are a build-int dev server, Restful request dispatching, Http request handling, and much more.

      Flask isn't as full of features as Django (which makes him lighter), but it still offers:

      • build-int dev server
      • Restful request dispatching
      • HTTP request handling
      • much more...
  8. Apr 2020
  9. Dec 2019
  10. Aug 2019
  11. Jun 2019
  12. Jun 2018
    1. Hmm. Definitely more http:// and a little more / than there needs to be. It seems like SERVER_NAME should be set to something more like localhost:5000. Let’s try.

      Still having issues when it comes to multi application routing.

  13. Sep 2017
  14. Apr 2017
  15. Jul 2015