gradio - Pythonで3分で機械学習モデルのUIを作成する

(Create UIs for your machine learning model in Python in 3 minutes)

Created at: 2018-12-19 16:24:04
Language: Python
License: Apache-2.0

CircleCI PyPIバージョン codecov PyPI-ダウンロード Twitterフォロー

グラディオへようこそ

機械学習モデルの周りに美しいユーザーインターフェイスをすばやく作成します。Gradio(GRAY-dee-ohと発音)を使用すると、ブラウザでモデルをデモしたり、自分の画像をドラッグアンドドロップしたり、テキストを貼り付けたり、自分の声を録音したりして、簡単にモデルを試してみることができます。モデルが何を出力するかを確認します。

インターフェイスモンタージュ

Gradioは次の場合に役立ちます。

  • クライアント/コラボレーター/ユーザー/学生向けの機械学習モデルのデモ

  • 自動共有可能なリンクを使用してモデルを迅速に展開し、モデルのパフォーマンスに関するフィードバックを取得する

  • 組み込みの操作および解釈ツールを使用して、開発中にモデルをインタラクティブにデバッグする

次のGettingStartedのインタラクティブバージョンはhttps://gradio.app/getting_startedにあります。

入門

前提条件:Python 3.7以降、それだけです。

クイックスタート

簡単な「Hello、World」の例でGradioを実行するには、次の3つの手順に従います。

1.pipからGradioをインストールします。

pip install gradio

2.以下のコードをPythonスクリプトまたはPythonノートブック(または colabノートブック)で実行します。

import gradio as gr


def greet(name):
    return "Hello " + name + "!!"


iface = gr.Interface(fn=greet, inputs="text", outputs="text")
iface.launch()

3.以下のインターフェースは、Pythonノートブック内に自動的に表示され ます。スクリプトから実行している場合は、 http:// localhost:7860のブラウザーに表示されます。

hello_worldインターフェース

Interface
クラスを理解する

Gradioは、ほとんどすべてのPython関数を使いやすいユーザーインターフェイスでラップできます。上記の例では、単純なテキストベースの関数を見ました。ただし、関数は、画像エンハンサーから税計算機、(最も一般的には)事前にトレーニングされた機械学習モデルの予測関数まで、何でもかまいません。

コア

Interface
クラスは、次の3つのパラメーターで初期化されます。

これらの3つの引数を使用すると、インターフェイスと

launch()
それらをすばやく作成できます。しかし、UIコンポーネントの外観や動作を変更したい場合はどうでしょうか。

カスタマイズ可能なコンポーネント

入力テキストフィールドをカスタマイズしたいとします。たとえば、入力テキストフィールドを大きくして、テキストヒントを設定したいとします。文字列のショートカットを使用する代わりに実際の入力クラスを使用する

Textbox
と、はるかに多くのカスタマイズ性にアクセスできます。サポートされているすべてのコンポーネントのリストと、それらをカスタマイズする方法については、ドキュメントをご覧ください。

import gradio as gr


def greet(name):
    return "Hello " + name + "!"


iface = gr.Interface(
    fn=greet,
    inputs=gr.inputs.Textbox(lines=2, placeholder="Name Here..."),
    outputs="text",
)
iface.launch()

hello_world_2インターフェース

複数の入力と出力

複数の入力と出力を備えた、はるかに複雑な関数があったとしましょう。次の例では、文字列、ブール値、および数値を受け取り、文字列と数値を返す関数があります。入力コンポーネントと出力コンポーネントのリストを渡す方法を見てください。

import gradio as gr


def greet(name, is_morning, temperature):
    salutation = "Good morning" if is_morning else "Good evening"
    greeting = "%s %s. It is %s degrees today" % (salutation, name, temperature)
    celsius = (temperature - 32) * 5 / 9
    return greeting, round(celsius, 2)


iface = gr.Interface(
    fn=greet,
    inputs=["text", "checkbox", gr.inputs.Slider(0, 100)],
    outputs=["text", "number"],
)
iface.launch()

hello_world_3インターフェース

コンポーネントをリストにラップするだけです。リスト内の各コンポーネントは

inputs
、関数のパラメーターの1つに順番に対応しています。リスト内の各コンポーネントは
outputs
、関数によって返される値の1つに対応しています。

画像の操作

画像間機能を試してみましょう。コンポーネントを使用する場合

Image
、関数は指定されたサイズのnumpy配列を受け取ります。形状
(width, height, 3)
は、最後の次元がRGB値を表します。画像もnumpy配列の形式で返します。

import numpy as np

import gradio as gr


def sepia(input_img):
    sepia_filter = np.array(
        [[0.393, 0.769, 0.189], [0.349, 0.686, 0.168], [0.272, 0.534, 0.131]]
    )
    sepia_img = input_img.dot(sepia_filter.T)
    sepia_img /= sepia_img.max()
    return sepia_img


iface = gr.Interface(sepia, gr.inputs.Image(shape=(200, 200)), "image")

iface.launch()

sepia_filterインターフェース

さらに、

Image
入力インターフェイスには、画像のトリミング、反転、回転、描画、およびフィルターの適用のためのツールを開く「編集」ボタンが付属しています。この方法で画像を操作すると、モデルの隠れた欠陥が明らかになることがよくあります。

画像に加えて、Gradioは、オーディオやビデオのアップロードなどの他のメディア入力タイプ、および多くの出力コンポーネントをサポートします。ドキュメントでこれらについて読んでください。

データフレームとグラフの操作

Gradioを使用して、numpy配列、pandasデータフレーム、プロットグラフなどの一般的なデータライブラリからの入力と出力をサポートできます。以下のデモを見てください(関数内の複雑なデータ操作は無視してください!)

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

import gradio as gr


def sales_projections(employee_data):
    sales_data = employee_data.iloc[:, 1:4].astype("int").to_numpy()
    regression_values = np.apply_along_axis(
        lambda row: np.array(np.poly1d(np.polyfit([0, 1, 2], row, 2))), 0, sales_data
    )
    projected_months = np.repeat(
        np.expand_dims(np.arange(3, 12), 0), len(sales_data), axis=0
    )
    projected_values = np.array(
        [
            month * month * regression[0] + month * regression[1] + regression[2]
            for month, regression in zip(projected_months, regression_values)
        ]
    )
    plt.plot(projected_values.T)
    plt.legend(employee_data["Name"])
    return employee_data, plt.gcf(), regression_values


iface = gr.Interface(
    sales_projections,
    gr.inputs.Dataframe(
        headers=["Name", "Jan Sales", "Feb Sales", "Mar Sales"],
        default=[["Jon", 12, 14, 18], ["Alice", 14, 17, 2], ["Sana", 8, 9.5, 12]],
    ),
    ["dataframe", "plot", "numpy"],
    description="Enter sales figures for employees to predict sales trajectory over year.",
)
iface.launch()

sales_projectionsインターフェース

入力例

ユーザーがモデルに簡単にロードできるサンプルデータを提供できます。これは、モデルが期待する入力のタイプを示したり、モデルと組み合わせてデータセットを探索する方法を提供したりするのに役立ちます。サンプルデータをロードする には、インターフェイスコンストラクターのキーワード引数にネストされたリストを 指定します。

examples=
外側のリスト内の各サブリストはデータサンプルを表し、サブリスト内の各要素は各入力コンポーネントの入力を表します。各コンポーネントのサンプルデータの形式は、 ドキュメントで指定されています。

import gradio as gr


def calculator(num1, operation, num2):
    if operation == "add":
        return num1 + num2
    elif operation == "subtract":
        return num1 - num2
    elif operation == "multiply":
        return num1 * num2
    elif operation == "divide":
        return num1 / num2


iface = gr.Interface(
    calculator,
    ["number", gr.inputs.Radio(["add", "subtract", "multiply", "divide"]), "number"],
    "number",
    examples=[
        [5, "add", 3],
        [4, "divide", 2],
        [-4, "multiply", 2.5],
        [0, "subtract", 1.2],
    ],
    title="test calculator",
    description="heres a sample toy calculator. enjoy!",
    flagging_options=["this", "or", "that"],
)

iface.launch()

電卓インターフェース

大きなデータセットを例にロードして、Gradioを介してデータセットを参照および操作できます。例は自動的にページ分割され(

examples_per_page
インターフェイスの引数を使用してこれを構成できます)、CTRL+矢印キーを使用して例をすばやくナビゲートできます。

ライブインターフェース

インターフェイスで設定することにより、インターフェイスを自動的に更新することができ

live=True
ます。これで、ユーザー入力が変更されるとすぐにインターフェースが再計算されます。

import gradio as gr


def calculator(num1, operation, num2):
    if operation == "add":
        return num1 + num2
    elif operation == "subtract":
        return num1 - num2
    elif operation == "multiply":
        return num1 * num2
    elif operation == "divide":
        return num1 / num2


iface = gr.Interface(
    calculator,
    ["number", gr.inputs.Radio(["add", "subtract", "multiply", "divide"]), "number"],
    "number",
    live=True,
)

iface.launch()

電卓_ライブインターフェース

インターフェイスは変更時に自動的に再送信されるため、送信ボタンがないことに注意してください。

状態の使用

関数は、単一の関数呼び出しを超えて存続するデータを使用する場合があります。データがすべての関数呼び出しとすべてのユーザーがアクセスできるものである場合は、関数呼び出しの外部でグローバル変数を作成し、関数内でアクセスできます。たとえば、関数の外部で大きなモデルをロードし、それを関数の内部で使用して、すべての関数呼び出しでモデルをリロードする必要がないようにすることができます。

Gradioがサポートするもう1つのタイプのデータ永続性は、セッション状態です。この場合、データはページの読み込み内の複数の送信にわたって永続化されます。ただし、モデルの異なるユーザー間でデータが共有されることはありません。データをセッション状態で保存するには、次の3つのことを行う必要があります。(1)インターフェイスの状態を表す追加のパラメーターを関数に渡します。(2)関数の最後に、状態の更新された値を追加の戻り値として返します。(3)を作成するときに、

'state'
入力コンポーネントと
'state'
出力コンポーネントを追加します
Interface
。以下のチャットボットの例を参照してください。

import random

import gradio as gr


def chat(message, history):
    history = history or []
    if message.startswith("How many"):
        response = random.randint(1, 10)
    elif message.startswith("How"):
        response = random.choice(["Great", "Good", "Okay", "Bad"])
    elif message.startswith("Where"):
        response = random.choice(["Here", "There", "Somewhere"])
    else:
        response = "I don't know"
    history.append((message, response))
    html = "<div class='chatbot'>"
    for user_msg, resp_msg in history:
        html += f"<div class='user_msg'>{user_msg}</div>"
        html += f"<div class='resp_msg'>{resp_msg}</div>"
    html += "</div>"
    return html, history


iface = gr.Interface(
    chat,
    ["text", "state"],
    ["html", "state"],
    css="""
    .chatbox {display:flex;flex-direction:column}
    .user_msg, .resp_msg {padding:4px;margin-bottom:4px;border-radius:4px;width:80%}
    .user_msg {background-color:cornflowerblue;color:white;align-self:start}
    .resp_msg {background-color:lightgray;align-self:self-end}
""",
    allow_screenshot=False,
    allow_flagging="never",
)
iface.launch()

チャットボットインターフェース

各ページ内の送信間で状態がどのように持続するかを確認してください。ただし、状態は2つのページ間で共有されません。注意すべき点がいくつかあります。デフォルト値を状態パラメーターに渡すことができます。これは、状態の初期値として使用されます。状態は、JSON形式にシリアル化できるものである必要があります(たとえば、辞書、リスト、または単一の値。通常、オブジェクトは機能しません)。

フラグ付け

出力インターフェイスの下に、「フラグ」とマークされたボタンがあります。モデルをテストしているユーザーが、誤ったモデルの動作や予期しないモデルの動作など、興味深い出力を含む入力を確認すると、インターフェイス作成者が確認できるように入力にフラグを立てることができます。インターフェイスコンストラクターへの引数によって提供されるディレクトリ内で

flagging_dir=
、CSVファイルはフラグが立てられた入力をログに記録します。画像や音声コンポーネントなどのファイルデータがインターフェイスに含まれている場合は、フラグが設定されたデータも保存するためのフォルダが作成されます。

たとえば、上記の計算機インターフェイスを使用すると、フラグ付きデータが以下に示すフラグ付きディレクトリに保存されます。

+-- calculator.py
+-- flagged/
|   +-- logs.csv

flaged / logs.csv

num1,operation,num2,Output
5,add,7,12
6,subtract,1.5,4.5

上記のsepiaインターフェースを使用すると、フラグ付きデータが以下に示すフラグ付きディレクトリに保存されます。

+-- sepia.py
+-- flagged/
|   +-- logs.csv
|   +-- im/
|   |   +-- 0.png
|   |   +-- 1.png
|   +-- Output/
|   |   +-- 0.png
|   |   +-- 1.png

flaged / logs.csv

im,Output
im/0.png,Output/0.png
im/1.png,Output/1.png

examples=
フラグ付きディレクトリを手動で探索してこれらのフラグ付き入力を確認するか、引数をフラグ付きディレクトリにポイントしてGradioインターフェイスの例にロードすることができます 。ユーザーにフラグを立てる理由を提供したい場合は、文字列のリストを
flagging_options
インターフェイスの引数に渡すことができます。ユーザーはフラグを立てるときに文字列の1つを選択する必要があります。これは、CSVに追加の列として保存されます。

インターフェースを公に共有する

share=True
メソッドを設定することで、インターフェースを簡単に公開できます
launch()
。このような:

gr.Interface(classify_image, "image", "label").launch(share=True)

これにより、誰にでも送信できる公開された共有可能なリンクが生成されます。このリンクを送信すると、反対側のユーザーはブラウザでモデルを試すことができます。処理はデバイス上で行われるため(デバイスがオンのままである限り)、依存関係のパッケージ化について心配する必要はありません。colabノートブックで作業している場合、共有リンクは常に自動的に作成されます。通常は次のようになります: XXXXX.gradio.app。リンクはグラディオリンクを介して提供されますが、当社はローカルサーバーのプロキシにすぎず、インターフェイスを介して送信されたデータは保存されません。

ただし、これらのリンクは一般公開されているため、誰でもモデルを予測に使用できることに注意してください。したがって、作成する関数を通じて機密情報を公開したり、デバイスで重大な変更が発生したりしないように注意してください。(デフォルト)を設定すると、ローカルリンクのみが作成され、 特定のユーザーとポートフォワーディング

share=False
で共有でき ます。

共有リンクは72時間後に期限切れになります。永続的なホスティングについては、以下の「スペースでのGradioアプリのホスティング」を参照してください。

共有図

スペースでのGradioアプリのホスティング

Huggingfaceは、インターネット上でGradioモデルを永続的にホストするためのインフラストラクチャを無料で提供します。Gradioモデルとすべての関連ファイルを含むフォルダーをドラッグアンドドロップするか、HF SpacesをGitリポジトリーにポイントすると、HPSpacesがそこからGradioインターフェースをプルします。詳細については、 HuggingfaceSpacesを参照してください。

ホスティングデモ

高度な機能

ここでは、Gradioデモに含めることができるいくつかの高度な機能について、さらに多くのコードを記述しなくても説明します。

認証

インターフェイスを開くことができるユーザーを制限するために、インターフェイスの前に認証ページを配置することをお勧めします。メソッドの

auth=
keyword引数を使用
launch()
すると、受け入れ可能なユーザー名/パスワードのタプルのリストを渡すことができます。または、より複雑な認証処理の場合は、ユーザー名とパスワードを引数として受け取り、認証を許可する場合はTrueを返し、それ以外の場合はFalseを返す関数を渡すこともできます。「admin」という名前の単一のユーザーにパスワードベースの認証を提供する例を次に示します。

gr.Interface(fn=classify_image, inputs=image, outputs=label).launch(auth=("admin", "pass1234"))

あなたの予測を解釈する

ほとんどのモデルはブラックボックスであるため、関数の内部ロジックはエンドユーザーから隠されています。透明性を高めるために、クラスの

interpretation
キーワードをに設定するだけで、モデルに解釈を簡単に追加できるようになりました。これにより、ユーザーは入力のどの部分が出力の原因であるかを理解できます。以下のシンプルなインターフェースを見てください。これは、解釈も含む画像分類子を示しています。
Interface
default

import requests
import tensorflow as tf

import gradio as gr

inception_net = tf.keras.applications.MobileNetV2()  # load the model

# Download human-readable labels for ImageNet.
response = requests.get("https://git.io/JJkYN")
labels = response.text.split("\n")


def classify_image(inp):
    inp = inp.reshape((-1, 224, 224, 3))
    inp = tf.keras.applications.mobilenet_v2.preprocess_input(inp)
    prediction = inception_net.predict(inp).flatten()
    return {labels[i]: float(prediction[i]) for i in range(1000)}


image = gr.inputs.Image(shape=(224, 224))
label = gr.outputs.Label(num_top_classes=3)

gr.Interface(
    fn=classify_image, inputs=image, outputs=label, interpretation="default"
).launch()

に加えて

default
、GradioにはShapleyベースの解釈も含まれています。これにより、通常は実行時間が遅くなりますが、より正確な解釈が提供されます。これを使用するには、
interpretation
パラメータをに設定するだけです
"shap"
(注:Pythonパッケージ
shap
がインストールされていることも確認してください)。オプションで、
num_shap
パラメーターを変更できます。これにより、精度と実行時間の間のトレードオフが制御されます(この値を増やすと、通常、精度が上がります)。次に例を示します。

gr.Interface(fn=classify_image, inputs=image, outputs=label, interpretation="shap", num_shap=5).launch()

これは、内部的にモデルが複雑なニューラルネットワークまたはその他のブラックボックスであっても、どの関数でも機能します。Gradio

default
または
shap
解釈を使用する場合、出力コンポーネントはである必要があります
Label
。すべての一般的な入力コンポーネントがサポートされています。これはテキスト入力の例です。

import re

import gradio as gr

male_words, female_words = ["he", "his", "him"], ["she", "hers", "her"]


def gender_of_sentence(sentence):
    male_count = len([word for word in sentence.split() if word.lower() in male_words])
    female_count = len(
        [word for word in sentence.split() if word.lower() in female_words]
    )
    total = max(male_count + female_count, 1)
    return {"male": male_count / total, "female": female_count / total}


iface = gr.Interface(
    fn=gender_of_sentence,
    inputs=gr.inputs.Textbox(default="She went to his house to get her keys."),
    outputs="label",
    interpretation="default",
)
iface.launch()

では、内部で何が起こっているのでしょうか。これらの解釈方法を使用すると、Gradioは、入力の変更されたバージョンを使用して予測を複数回実行します。結果に基づいて、インターフェースがテキスト(または画像など)の部分を自動的に強調表示し、クラスが赤である可能性を高めたことがわかります。色の濃さは、入力のその部分の重要性に対応しています。クラスの信頼性を低下させる部分は青色で強調表示されます。

独自の解釈関数を作成することもできます。以下のデモは、前のデモにカスタム解釈を追加します。この関数は、メインのラップされた関数と同じ入力を受け取ります。この解釈関数の出力は、各入力インターフェイスの入力を強調表示するために使用されます。したがって、ここでの出力の数は、入力インターフェイスの数に対応します。各入力インターフェイスの解釈の形式を確認するには、ドキュメントを確認してください。

import re

import gradio as gr

male_words, female_words = ["he", "his", "him"], ["she", "hers", "her"]


def gender_of_sentence(sentence):
    male_count = len([word for word in sentence.split() if word.lower() in male_words])
    female_count = len(
        [word for word in sentence.split() if word.lower() in female_words]
    )
    total = max(male_count + female_count, 1)
    return {"male": male_count / total, "female": female_count / total}


def interpret_gender(sentence):
    result = gender_of_sentence(sentence)
    is_male = result["male"] > result["female"]
    interpretation = []
    for word in re.split("( )", sentence):
        score = 0
        token = word.lower()
        if (is_male and token in male_words) or (not is_male and token in female_words):
            score = 1
        elif (is_male and token in female_words) or (
            not is_male and token in male_words
        ):
            score = -1
        interpretation.append((word, score))
    return interpretation


iface = gr.Interface(
    fn=gender_of_sentence,
    inputs=gr.inputs.Textbox(default="She went to his house to get her keys."),
    outputs="label",
    interpretation=interpret_gender,
    enable_queue=True,
)
iface.launch()

テーマとカスタムスタイリング

インターフェイスの外観を変更したい場合は、次の

theme
ようにパラメータを渡すだけで別のテーマを選択できます。

gr.Interface(fn=classify_image, inputs=image, outputs=label, theme="huggingface").launch()

現在サポートしているテーマは次のとおりです:

"default"
、、、、およびこれらのそれぞれに対応するダークテーマ:
"huggingface"
、、、。
"grass"
"peach"
"darkdefault"
"darkhuggingface"
"darkgrass"
"darkpeach"

アプリのあらゆる側面をよりきめ細かく制御したい場合は、クラスの

css
パラメーターを使用して、独自のcssを作成するか、cssファイルを渡すこともできます。
Interface

カスタムフラグオプション

場合によっては、サンプルにフラグを立てるための単なるバイナリオプション以上のものをユーザーまたはテスターに​​提供したい場合があります。

flagging_options
フラグボタンをクリックするたびに、ドロップダウンから選択するように指定できます。これにより、サンプルにフラグを立てるたびに追加のフィードバックを提供できます。

次に例を示します。

gr.Interface(fn=classify_image, inputs=image, outputs=label, flagging_options=["incorrect", "ambiguous", "offensive", "other"]).launch()

抱きしめる顔のモデルとスペースの読み込み

GradioはHuggingFaceHubとうまく統合されているため、1行のコードでモデルとスペースを読み込むことができます。これを使用するには、クラスの

load()
メソッドを使用するだけです。
Interface
それで:

  • Hugging Face Hubからモデルをロードし、その周りにインターフェイスを作成するには、次の例のように、モデル名を渡す
    "model/"
    か、その後に続けます。
    "huggingface/"
gr.Interface.load("huggingface/gpt2").launch();
gr.Interface.load("huggingface/EleutherAI/gpt-j-6B", 
    inputs=gr.inputs.Textbox(lines=5, label="Input Text")  # customizes the input component
).launch()
  • Hugging Face Hubから任意のスペースをロードしてローカルで再作成するには(たとえば、入力と出力をカスタマイズできるように)、パス
    "spaces/"
    の後にモデル名を渡します。
gr.Interface.load("spaces/eugenesiow/remove-bg", inputs="webcam", title="Remove your webcam background!").launch()

Gradioを使用してHuggingFaceモデルまたはスペースをロードすることの優れた点の1つは、

Interface
Pythonコードの関数と同じように、結果のオブジェクトをすぐに使用できることです(これは、テキスト、画像、オーディオ、ビデオ、さらにマルチモーダルモデル):

io = gr.Interface.load("models/EleutherAI/gpt-neo-2.7B")
io("It was the best of times")  # outputs model completion

インターフェースを並列および直列に配置する

gradio.Parallel
Gradioでは、と
gradio.Series
クラスを使用してインターフェイスを非常に簡単に混在させることもできます。
Parallel
2つの類似したモデル(同じ入力タイプの場合)を並列に配置して、モデルの予測を比較できます。

generator1 = gr.Interface.load("huggingface/gpt2")
generator2 = gr.Interface.load("huggingface/EleutherAI/gpt-neo-2.7B")
generator3 = gr.Interface.load("huggingface/EleutherAI/gpt-j-6B")

gr.Parallel(generator1, generator2, generator3).launch()

Series
モデルとスペースを直列に配置して、あるモデルの出力を次のモデルの入力にパイプすることができます。

generator = gr.Interface.load("huggingface/gpt2")
translator = gr.Interface.load("huggingface/t5-small")

gr.Series(generator, translator).launch()  # this demo generates text, then translates it to German, and outputs the final result.

そしてもちろん、それが理にかなっているときはいつでも

Parallel
、一緒に混ぜることもできます!
Series

長い推論時間を管理するためのキューイング

多くの人がインターフェースを使用している場合、または関数の推論時間が長い(> 1分)場合は、タイムアウトを防ぐためにメソッドの

enable_queue
パラメーターを設定するだけです。
launch
True

gr.Interface(fn=classify_image, inputs=image, outputs=label).launch(enable_queue=True)

これにより、予測を処理して応答をフロントエンドに返すワーカーのキューが設定されます。これは、デモをHugging Face Spacesにアップロードすることを計画している場合(上記のとおり)、デモを使用して多数のユーザーを同時に管理できるようにするために強くお勧めします。

システム要求:

GradioにはPythonが必要

3.7+
であり、最新バージョンのWindows、MacOS、およびさまざまな一般的なLinuxディストリビューション(Ubuntuなど)でテストされています。
setup.py
Pythonパッケージの要件については、ファイルを参照してください。

貢献:

貢献したいが貢献が少ない場合は、プルリクエスト(PR)を直接開くことができます。より大きな機能を提供したい場合は、最初に提案された設計で問題を作成して議論することをお勧めします。詳細については、寄稿ガイドラインをご覧ください。

ライセンス:

GradioはApacheLicense2.0の下でライセンスされています

続きを見る:

あなたは私たちのウェブサイトでより多くの例と使用法に関するより多くの情報を見つけることができます:www.gradio.app

添付の論文「Gradio:野生のMLモデルの手間のかからない共有とテスト」ICML HILL 2019も参照してください。また、以下の引用を使用してください。

@article{abid2019gradio,
title={Gradio: Hassle-Free Sharing and Testing of ML Models in the Wild},
author={Abid, Abubakar and Abdalla, Ali and Abid, Ali and Khan, Dawood and Alfozan, Abdulrahman and Zou, James},
journal={arXiv preprint arXiv:1906.02569},
year={2019}
}