自動化された研究アーティファクト — 上流プロジェクトではありません。
このリポジトリは、ラヴァル大学の修士論文のために、公開されているGitHub Actionsワークフローの脆弱性を再現することを目的として、自動化ハーネスによって構築された使い捨てのラボです。これは
gradio-app/gradioのコミット1d986217f6f4fc1829e528d2afe365635788204f(2023-11-03)時点の逐語的なスナップショットであり、そのプロジェクト自身のライセンスの下で再配布されており、そのライセンスファイルはこのスナップショットに変更なしで含まれています。上流プロジェクトは関与しておらず、決して標的にはされておらず、ここで研究されている脆弱性はすでに公開されています。このリポジトリ内のすべてのシークレットと変数はランダムに生成されたダミー値であり、実際の認証情報は存在しません。アクションの参照とランナーイメージは、2023-11-03時点で解決されたものに固定されています。スナップショットに加えられたすべての変更については、ハーネス出力の
pinning.mdを参照してください。質問や異議がある場合: [email protected]
Website | Documentation | Guides | Getting Started | Examples | 中文
Gradioは、機械学習やデータサイエンスのデモ、Webアプリケーションを構築するためのオープンソースのPythonライブラリです。
Gradioを使えば、機械学習モデルやデータサイエンスのワークフローの周りに美しいユーザーインターフェースをすばやく作成し、ユーザーが自分の画像をドラッグ&ドロップしたり、テキストを貼り付けたり、自分の声を録音したり、デモと対話したりできるようにすることができます。これらはすべてブラウザ上で行えます。

Gradioは以下のような場面で役立ちます:
クライアント/共同作業者/ユーザー/学生向けに機械学習モデルをデモする。
自動共有リンクを使ってモデルをすばやくデプロイし、モデルのパフォーマンスに関するフィードバックを得る。
開発中に組み込みの入力操作ツールを使ってモデルを対話的にデバッグする。
前提条件: GradioにはPython 3.8以上が必要です。それだけです!
機械学習モデル、API、データサイエンスのワークフローを他の人と共有するための_最良の方法_の1つは、ユーザーや同僚がブラウザでデモを試せるインタラクティブアプリを作成することです。
Gradioを使えば、デモを構築して共有することが、すべてPythonでできます。しかも、通常はほんの数行のコードで!それでは始めましょう。
簡単な「Hello, World」の例でGradioを動かすには、次の3つの手順に従ってください:
1. pipを使ってGradioをインストールします:
pip install gradio
2. 以下のコードをPythonスクリプトまたはJupyter Notebook(またはGoogle Colab)で実行します:
import gradio as gr
def greet(name):
return "Hello " + name + "!"
demo = gr.Interface(fn=greet, inputs="text", outputs="text")
demo.launch()
Gradioを使用するコードの可読性を高めるために、インポートした名前を gr に短縮しています。これは広く採用されている慣例であり、あなたのコードを扱う誰もが簡単に理解できるように、この慣例に従うべきです。
3. 以下のデモは、Jupyter Notebook内に自動的に表示されるか、スクリプトから実行した場合はブラウザでhttp://localhost:7860にポップアップ表示されます:

ローカルで開発する際、コードをPythonスクリプトとして実行したい場合は、Gradio CLIを使用してアプリケーションをリロードモードで起動できます。これにより、シームレスで高速な開発が可能になります。リロードの詳細については、Auto-Reloading Guideをご覧ください。
gradio app.py
注: python app.py とすることもできますが、自動リロード機能は提供されません。
Interface クラスデモを作成するために gr.Interface を作成したことに気づくでしょう。この Interface クラスは、任意のPython関数をユーザーインターフェースでラップできます。上記の例では単純なテキストベースの関数を見ましたが、関数は音楽ジェネレーターから税計算機、事前学習済み機械学習モデルの予測関数まで、何でもかまいません。
コアとなる Interface クラスは、3つの必須パラメータで初期化されます:
fn: UIでラップする関数inputs: 入力に使用するコンポーネント(例: "text"、"image"、"audio")outputs: 出力に使用するコンポーネント(例: "text"、"image"、"label")これらの入出力を提供するために使用されるコンポーネントを詳しく見てみましょう。
前の例では単純な Textbox コンポーネントを見ましたが、UIコンポーネントの外観や動作を変更したい場合はどうすればよいでしょうか?
入力テキストフィールドをカスタマイズしたいとしましょう。たとえば、より大きくしてテキストプレースホルダーを設定したい場合です。文字列のショートカットの代わりに Textbox の実際のクラスを使用すると、コンポーネント属性を通じてはるかに多くのカスタマイズが可能になります。
import gradio as gr
def greet(name):
return "Hello " + name + "!"
demo = gr.Interface(
fn=greet,
inputs=gr.Textbox(lines=2, placeholder="Name Here..."),
outputs="text",
)
demo.launch()

複数の入力と出力を持つ、より複雑な関数があるとしましょう。以下の例では、文字列、ブール値、数値を受け取り、文字列と数値を返す関数を定義しています。入力コンポーネントと出力コンポーネントのリストを渡す方法を見てみましょう。
import gradio as gr
def greet(name, is_morning, temperature):
salutation = "Good morning" if is_morning else "Good evening"
greeting = f"{salutation} {name}. It is {temperature} degrees today"
celsius = (temperature - 32) * 5 / 9
return greeting, round(celsius, 2)
demo = gr.Interface(
fn=greet,
inputs=["text", "checkbox", gr.Slider(0, 100)],
outputs=["text", "number"],
)
demo.launch()

コンポーネントをリストでラップするだけです。inputs リスト内の各コンポーネントは、関数のパラメータの1つに順番に対応します。outputs リスト内の各コンポーネントは、関数によって返される値の1つに、これも順番に対応します。
Gradioは、Image、DataFrame、Video、Label など、多くの種類のコンポーネントをサポートしています。これらの感覚をつかむために、画像から画像への関数を試してみましょう!
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
demo = gr.Interface(sepia, gr.Image(width=200, height=200), "image")
demo.launch()

Image コンポーネントを入力として使用する場合、関数は形状 (height, width, 3) のNumPy配列を受け取ります。ここで、最後の次元はRGB値を表します。また、NumPy配列の形式で画像を返します。
type= キーワード引数を使用して、コンポーネントが使用するデータ型を設定することもできます。たとえば、関数がNumPy配列の代わりに画像へのファイルパスを受け取るようにしたい場合、入力 Image コンポーネントは次のように記述できます:
gr.Image(type="filepath", shape=...)
また、入力 Image コンポーネントには編集ボタン 🖉 が付いており、画像の切り抜きやズームが可能です。このように画像を操作することで、機械学習モデルのバイアスや隠れた欠陥を明らかにすることができます!
多くのコンポーネントとその使用方法の詳細については、Gradio docsをご覧ください。
Gradioには、gr.Interface に似ていますが、チャットボットUI専用に設計された高レベルクラス gr.ChatInterface が含まれています。gr.ChatInterface クラスも関数をラップしますが、この関数は特定のシグネチャを持つ必要があります。関数は2つの引数、message と history を受け取る必要があります(引数名は何でもかまいませんが、この順序である必要があります)。
message: ユーザーの入力を表す strhistory: その時点までの会話を表す list の list。各内部リストは、[ユーザー入力, ボット応答] のペアを表す2つの str で構成されます。関数は、特定のユーザー入力 message に対するボットの応答である単一の文字列応答を返す必要があります。
それ以外に、gr.ChatInterface には必須パラメータはありません(ただし、UIをカスタマイズするためのパラメータがいくつか用意されています)。
おもちゃの例を次に示します:
import random
import gradio as gr
def random_response(message, history):
return random.choice(["Yes", "No"])
demo = gr.ChatInterface(random_response)
demo.launch()

gr.ChatInterface の詳細はこちらで読むことができます。
Gradioはアプリを構築するための2つのアプローチを提供します:
1. Interface と ChatInterface。これまで説明してきたデモを作成するための高レベルの抽象化を提供します。
2. Blocks。より柔軟なレイアウトとデータフローでWebアプリを設計するための低レベルAPIです。Blocksを使用すると、複数のデータフローとデモを特徴付けたり、コンポーネントがページ上のどこに表示されるかを制御したり、複雑なデータフロー(出力が他の関数への入力として機能するなど)を処理したり、ユーザーの操作に基づいてコンポーネントのプロパティ/可視性を更新したりできます。これらはすべてPythonで行えます。このカスタマイズ性が必要な場合は、代わりに Blocks を試してください!
簡単な例を見てみましょう。ここでのAPIが Interface とどのように異なるかに注目してください。
import gradio as gr
def greet(name):
return "Hello " + name + "!"
with gr.Blocks() as demo:
name = gr.Textbox(label="Name")
output = gr.Textbox(label="Output Box")
greet_btn = gr.Button("Greet")
greet_btn.click(fn=greet, inputs=name, outputs=output, api_name="greet")
demo.launch()

注意すべき点:
Blocks は with 句で作成され、この句内で作成されたコンポーネントは自動的にアプリに追加されます。Button が作成され、このボタンに click イベントリスナーが追加されました。このAPIはおなじみのはずです!Interface と同様に、click メソッドはPython関数、入力コンポーネント、出力コンポーネントを受け取ります。Blocks で何が可能かを味わっていただくためのアプリを次に示します:
import numpy as np
import gradio as gr
def flip_text(x):
return x[::-1]
def flip_image(x):
return np.fliplr(x)
with gr.Blocks() as demo:
gr.Markdown("Flip text or image files using this demo.")
with gr.Tab("Flip Text"):
text_input = gr.Textbox()
text_output = gr.Textbox()
text_button = gr.Button("Flip")
with gr.Tab("Flip Image"):
with gr.Row():
image_input = gr.Image()
image_output = gr.Image()
image_button = gr.Button("Flip")
with gr.Accordion("Open for More!"):
gr.Markdown("Look at me...")
text_button.click(flip_text, inputs=text_input, outputs=text_output)
image_button.click(flip_image, inputs=image_input, outputs=image_output)
demo.launch()

ここではさらに多くのことが行われています!このような複雑な Blocks アプリの作成方法については、building with blocksセクションで説明します。
おめでとうございます。これでGradioの基本を理解できました!🥳 次のガイドに進んで、Gradioの主要な機能について詳しく学びましょう。
Gradioは多くの素晴らしいオープンソースライブラリで構築されています。ぜひそれらもサポートしてください!
Gradioは、このリポジトリのルートディレクトリにあるLICENSEファイルに記載されているApache License 2.0の下でライセンスされています。
また、論文 Gradio: Hassle-Free Sharing and Testing of ML Models in the Wild, ICML HILL 2019 もご覧ください。Gradioを研究で使用する場合は、これを引用してください。
@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},
}