Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save charlieforward9/27b323849854a9718e2748fac54d54bb to your computer and use it in GitHub Desktop.
Save charlieforward9/27b323849854a9718e2748fac54d54bb to your computer and use it in GitHub Desktop.
Flutter AI Server: Overview, Design & Considerations

Flutter AI Server: Overview, Design & Considerations

Conversation with ChatGPT Model-4

Overview of the various options, with a deep dive into the implementation using AWS Amplify with the GraphQL API capabilities. Finished with real-time feedback considerations.


Chat Name: Flutter AI Server Implementation

Hey, I want to learn more about implementing custom AI capabilities on a Flutter app by setting up a server of some sort and calling it there. I am using Amplify, but understand if I need to use services outside of Amplify to run the custom python code. I would like to know about ALL of my options, including the simplest, most scalable and most cost effective.

To implement custom AI capabilities on a Flutter app, you can set up a server to host and run your AI models, and then call the server using your app. There are several options for setting up a server, including using AWS, Google Cloud Platform, or Microsoft Azure, among others. Amplify is a great tool for Flutter, but since you want to consider all options, here is a list of various approaches you can take:

AWS Lambda + API Gateway

You can use AWS Lambda to run your Python code and create an API Gateway to expose your Lambda function. This is a serverless option, meaning you don't need to manage the underlying infrastructure. It's cost-effective and scales automatically based on the number of requests.

AWS Elastic Beanstalk

Elastic Beanstalk is a Platform as a Service (PaaS) offering by AWS, which allows you to deploy and manage applications without worrying about the underlying infrastructure. You can easily deploy a Flask or Django web application, which hosts your custom Python code, and it can scale automatically.

Google Cloud Functions + API Gateway

Similar to AWS Lambda, you can use Google Cloud Functions to run your Python code and API Gateway to expose your functions. This serverless option is also cost-effective and scales automatically based on the number of requests.

Google App Engine

Google App Engine is another PaaS offering, similar to AWS Elastic Beanstalk, which allows you to deploy and manage applications without worrying about the underlying infrastructure. You can deploy a Flask or Django web application, which hosts your custom Python code, and it can scale automatically.

Microsoft Azure Functions + API Management

Azure Functions is a serverless compute service that allows you to run your Python code without worrying about the infrastructure. You can create an API using Azure API Management to expose your Azure Functions. This option is cost-effective and scales automatically based on the number of requests.

Microsoft Azure App Service

Azure App Service is a PaaS offering that allows you to deploy and manage web applications, including Flask or Django applications, without worrying about the underlying infrastructure. It supports custom Python code and scales automatically.

Self-managed server

You can also set up your own server, using a virtual machine on AWS EC2, Google Compute Engine, or Azure Virtual Machines. This option requires more setup and maintenance, but it gives you full control over the server environment.

Once you've chosen an option and set up your server, you can call your custom AI capabilities using HTTP requests from your Flutter app. You can use the http package in Flutter to make these requests.

Keep in mind that each option has its own pricing model, so it's essential to compare the costs and choose the one that best suits your needs. The serverless options (e.g., AWS Lambda, Google Cloud Functions, and Azure Functions) are generally more cost-effective for smaller-scale projects or variable workloads, while the PaaS options (e.g., AWS Elastic Beanstalk, Google App Engine, and Azure App Service) may be more suitable for larger-scale projects with consistent workloads.


I like AWS Lambda + API Gateway to start, it seems like there are features on Amplify that can handle all of that. What would the pipeline look for that using graphQL?

Yes, you can use AWS Amplify with AWS Lambda and AWS AppSync to create the pipeline you need when using GraphQL. Amplify simplifies the process of setting up and deploying your serverless backend, and it also provides client libraries for your Flutter app to interact with the backend services. Here's a high-level overview of the pipeline:

Create your custom Python AI code

Develop your custom AI capabilities using Python, and package any necessary dependencies.

Create an AWS Lambda function

Using the Amplify CLI, you can create a new AWS Lambda function that will host your custom Python AI code. To do this, run amplify add function, and follow the prompts to set up the function with your desired settings. Make sure to select the python runtime. Upload your custom Python code and dependencies to the Lambda function.

Create an AppSync GraphQL API

With the Amplify CLI, create a new GraphQL API using AWS AppSync. Run amplify add api, and follow the prompts to set up the API. Choose GraphQL as the API type, and configure the API to use AWS AppSync.

Define your GraphQL schema

Create a schema for your GraphQL API that defines the queries and mutations you want to expose. This schema will determine how your Flutter app interacts with the backend. For example, you could create a getPrediction query that takes an input and returns the prediction from your custom AI model.

Connect Lambda function to the GraphQL API

In the amplify/backend/api/<your-api-name>/stacks/CustomResources.json file, add a new data source of type AWS_Lambda, and link it to your Lambda function. Then, create a new resolver for the getPrediction query (or any other queries and mutations you defined), and map it to the Lambda function data source.

Configure access control

Set up the desired authentication and authorization methods for your API. Amplify supports various authentication providers such as Amazon Cognito, API Key, AWS IAM, and OpenID Connect. Choose the appropriate provider based on your requirements.

Deploy your backend

Run amplify push to deploy your Lambda function and AppSync API to the cloud. The Amplify CLI will automatically provision the necessary resources and configure the connections between them.

Integrate with your Flutter app

Add the amplify_flutter package to your Flutter project, and configure it with the Amplify configuration generated by the CLI. Use the Amplify Flutter library to perform queries and mutations against your GraphQL API. For example, you can use the AmplifyAPI.query() and AmplifyAPI.mutate() methods to interact with your backend services.

This pipeline provides a seamless integration between your Flutter app and your custom AI capabilities hosted on AWS Lambda, with AWS AppSync acting as the GraphQL API layer.


Would this work with images coming from a camera stream? I am expecting real-time feedback

Considerations

Using AWS Lambda, AppSync, and Amplify with a camera stream for real-time feedback is possible, but there are some limitations and considerations to keep in mind:

Latency

Using Lambda functions and AppSync introduces some latency, as the image data needs to be sent to the Lambda function for processing, and then the results are returned to your Flutter app. This may not be ideal for real-time applications that require low latency.

Image data size

Images from a camera stream can be large, and sending large amounts of data over the network can cause delays. To improve performance, you can compress the images or reduce their resolution before sending them to the Lambda function.

Lambda execution time

AWS Lambda has a maximum execution time limit of 15 minutes. If your AI model takes a long time to process the images, it might exceed this limit. However, for most use cases, processing times should be significantly less than the limit.

Base64 encoding

To send image data to the Lambda function through AppSync, you'll need to convert the image to a Base64-encoded string, which increases the data size by about 33%. Keep this in mind when considering the latency and data transfer times.

Advancements

Despite these limitations, you can still implement real-time feedback with the following adjustments:

Optimize image data

Compress the images or reduce their resolution before sending them to the Lambda function to minimize latency and data transfer times.

Optimize Lambda function

Optimize your custom AI code to process images as quickly as possible, taking advantage of libraries like TensorFlow Lite or ONNX Runtime for efficient model execution.

Use subscriptions

To receive real-time feedback, you can use AppSync subscriptions to establish a real-time connection between your Flutter app and the backend. This way, your app will receive updates as soon as the Lambda function finishes processing the image.

With these adjustments, you can achieve near real-time feedback with AWS Lambda, AppSync, and Amplify for camera stream processing. However, if low latency is crucial for your application, you might want to consider edge processing options such as running the AI model directly on the device using TensorFlow Lite or using AWS Greengrass to deploy and run the Lambda function on an edge device.

Thank you for reading

If this was valuable, please react to this and give it a star to help others find it and learn how to develop ML apps better and faster!

🚀 ⭐️

References

AWS

Google Cloud Platform

Microsoft Azure

Libraries and Frameworks

@charlieforward9
Copy link
Author

I have learned a lot since I built this, I have decided to move to a Native iOS approach for doing real time computer vision due to performance.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment