import gradio as gr import models import pandas as pd import theme text = "
In this demo application, we help you compare different AI model services, such as Open source or SaaS solutions, based on the Total Cost of Ownership for their deployment. Please note that we focus on getting the service up and running, but not the maintenance that follows.
First, you'll have to select your use case. Then, select the two model service options you'd like to compare. Depending on the options you chose, you could be able to customize some parameters of the set-up. Eventually, we will provide you with the cost of deployment for the selected model services, as a function of the number of requests experienced by your service. You can compare both solutions to evaluate which one best suits your needs.
""" markdown = """{comparison_result}
{comparison_result3}
""" return info def create_table(tco1, tco2, labor_cost1, labor_cost2, dropdown, dropdown2): list_values = [] labor_cost1 = round(labor_cost1, 1) labor_cost2 = round(labor_cost2, 1) first_sol = [tco1, labor_cost1] second_sol = [tco2, labor_cost2] list_values.append(first_sol) list_values.append(second_sol) data = pd.DataFrame(list_values, index=["1)" + " " + dropdown, "2)" + " " + dropdown2], columns=["Cost/request ($) ", "Labor Cost ($/month)"]) formatted_data = data.copy() formatted_data["Cost/request ($) "] = formatted_data["Cost/request ($) "].apply('{:.5f}'.format) formatted_data["Labor Cost ($/month)"] = formatted_data["Labor Cost ($/month)"].apply('{:.1f}'.format) styled_data = formatted_data.style\ .set_properties(**{'background-color': '#081527', 'color': '#ffffff', 'border-color': '#ffffff', 'border-width': '1px', 'border-style': 'solid'})\ .to_html() return gr.update(value=styled_data) def update_plot(tco1, tco2, dropdown, dropdown2, labour_cost1, labour_cost2): request_ranges = [100, 200, 300, 400, 500, 1000, 10000] costs_tco1 = [(tco1 * req + labour_cost1) for req in request_ranges] costs_tco2 = [(tco2 * req + labour_cost2) for req in request_ranges] data = pd.DataFrame({ "Number of requests": request_ranges * 2, "Cost ($)": costs_tco1 + costs_tco2, "AI model service": ["1)" + " " + dropdown] * len(request_ranges) + ["2)" + " " + dropdown2] * len(request_ranges) } ) return gr.LinePlot.update(data, visible=True, x="Number of requests", y="Cost ($)",color="AI model service",color_legend_position="bottom", title="Total Cost of Model Serving for one month", height=300, width=500, tooltip=["Number of requests", "Cost ($)", "AI model service"]) style = theme.Style() with gr.Blocks(theme=style) as demo: Models: list[models.BaseTCOModel] = [models.OpenAIModel, models.CohereModel, models.OpenSourceLlama2Model] model_names = [Model().get_name() for Model in Models] gr.Markdown(value=text) gr.Markdown(value=description) with gr.Row(): with gr.Column(): with gr.Row(): use_case = gr.Dropdown(["Summarize", "Question-Answering", "Classification"], value="Question-Answering", label=" Describe your use case ") with gr.Accordion("Click here if you want to customize the number of input and output tokens per request", open=False): with gr.Row(): input_tokens = gr.Slider(minimum=1, maximum=1000, value=300, step=1, label=" Input tokens per request", info="We suggest a value that we believe best suit your use case choice but feel free to adjust", interactive=True) output_tokens = gr.Slider(minimum=1, maximum=1000, value=300, step=1, label=" Output tokens per request", info="We suggest a value that we believe best suit your use case choice but feel free to adjust", interactive=True) with gr.Row(visible=False): num_users = gr.Number(value="1000", interactive = True, label=" Number of users for your service ") use_case.change(on_use_case_change, inputs=use_case, outputs=[input_tokens, output_tokens]) with gr.Row(): with gr.Column(): page1 = models.ModelPage(Models) dropdown = gr.Dropdown(model_names, interactive=True, label=" First AI service option ") with gr.Accordion("Click here for more information on the computation parameters for your first AI service option", open=False): page1.render() with gr.Column(): page2 = models.ModelPage(Models) dropdown2 = gr.Dropdown(model_names, interactive=True, label=" Second AI service option ") with gr.Accordion("Click here for more information on the computation parameters for your second AI service option", open=False): page2.render() dropdown.change(page1.make_model_visible, inputs=[dropdown, use_case], outputs=page1.get_all_components()) dropdown2.change(page2.make_model_visible, inputs=[dropdown2, use_case], outputs=page2.get_all_components()) compute_tco_btn = gr.Button("Compute & Compare", size="lg", variant="primary", scale=1) tco1 = gr.State() tco2 = gr.State() labor_cost1 = gr.State() labor_cost2 = gr.State() with gr.Row(): with gr.Column(): tco_output = gr.Text("Cost/request 1: ", label=" Cost/request for the first option ", info="This is only the infrastructure cost per request for deployment, the labor cost still has to be added for the AI model service deployment TCO.") latency_info = gr.Markdown() with gr.Accordion("Click here to see the formula", open=False): tco_formula = gr.Markdown() with gr.Column(): tco_output2 = gr.Text("Cost/request 2: ", label=" Cost/request for the second option ", info="This is only the infrastructure cost per request for deployment, the labor cost still has to be added for the AI model service deployment TCO.") latency_info2 = gr.Markdown() with gr.Accordion("Click here to see the formula", open=False): tco_formula2 = gr.Markdown() with gr.Row(): gr.Markdown(markdown) with gr.Row(variant='panel'): with gr.Column(scale=1): table = gr.Markdown() with gr.Column(scale=2): info = gr.Markdown() with gr.Row(): plot = gr.LinePlot(visible=False) compute_tco_btn.click(page1.compute_cost_per_token, inputs=page1.get_all_components_for_cost_computing() + [dropdown, input_tokens, output_tokens], outputs=[tco_output, tco1, tco_formula, latency_info, labor_cost1]).then(page2.compute_cost_per_token, inputs=page2.get_all_components_for_cost_computing() + [dropdown2, input_tokens, output_tokens], outputs=[tco_output2, tco2, tco_formula2, latency_info2, labor_cost2]).then(create_table, inputs=[tco1, tco2, labor_cost1, labor_cost2, dropdown, dropdown2], outputs=table).then(compare, inputs=[tco1, tco2, labor_cost1, labor_cost2, dropdown, dropdown2], outputs=info).then(update_plot, inputs=[tco1, tco2, dropdown, dropdown2, labor_cost1, labor_cost2], outputs=plot) demo.launch(debug=True)