Gradio 月活跃用户突破 100 万!

阅读更多
Gradio logo
  1. 其他教程
  2. Gradio 和 Comet

使用 Gradio 和 Comet

简介

在本指南中,我们将演示一些将 Gradio 与 Comet 结合使用的方法。我们将介绍 Gradio 与 Comet 结合使用的基础知识,并向你展示如何利用 Gradio 的高级功能,例如 使用 iFrame 嵌入状态 来构建一些惊人的模型评估工作流程。

以下是本指南涵盖的主题列表。

  1. 将 Gradio UI 记录到你的 Comet 实验
  2. 将 Gradio 应用程序直接嵌入到你的 Comet 项目中
  3. 将 Hugging Face Spaces 直接嵌入到你的 Comet 项目中
  4. 将模型推断从你的 Gradio 应用程序记录到 Comet

什么是 Comet?

Comet 是一个 MLOps 平台,旨在帮助数据科学家和团队更快地构建更好的模型!Comet 提供工具来在一个地方跟踪、解释、管理和监控你的模型!它适用于 Jupyter Notebooks 和脚本,最重要的是它是 100% 免费的!

设置

首先,安装运行这些示例所需的依赖项

pip install comet_ml torch torchvision transformers gradio shap requests Pillow

接下来,你需要 注册一个 Comet 帐户。设置好你的帐户后,获取你的 API 密钥 并配置你的 Comet 凭据

如果你以脚本形式运行这些示例,你可以将你的凭据导出为环境变量

export COMET_API_KEY="<Your API Key>"
export COMET_WORKSPACE="<Your Workspace Name>"
export COMET_PROJECT_NAME="<Your Project Name>"

或者在你的工作目录中的 .comet.config 文件中设置它们。你的文件应采用以下格式。

[comet]
api_key=<Your API Key>
workspace=<Your Workspace Name>
project_name=<Your Project Name>

如果你正在使用提供的 Colab Notebooks 运行这些示例,请在启动 Gradio UI 之前运行包含以下代码片段的单元格。运行此单元格允许你以交互方式将你的 API 密钥添加到 notebook。

import comet_ml
comet_ml.init()

1. 将 Gradio UI 记录到你的 Comet 实验

Open In Colab

在此示例中,我们将介绍如何将你的 Gradio 应用程序记录到 Comet 并使用 Gradio 自定义面板与之交互。

让我们从使用 resnet18 构建一个简单的图像分类示例开始。

import comet_ml

import requests
import torch
from PIL import Image
from torchvision import transforms

torch.hub.download_url_to_file("https://github.com/pytorch/hub/raw/master/images/dog.jpg", "dog.jpg")

if torch.cuda.is_available():
    device = "cuda"
else:
    device = "cpu"

model = torch.hub.load("pytorch/vision:v0.6.0", "resnet18", pretrained=True).eval()
model = model.to(device)

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


def predict(inp):
    inp = Image.fromarray(inp.astype("uint8"), "RGB")
    inp = transforms.ToTensor()(inp).unsqueeze(0)
    with torch.no_grad():
        prediction = torch.nn.functional.softmax(model(inp.to(device))[0], dim=0)
    return {labels[i]: float(prediction[i]) for i in range(1000)}


inputs = gr.Image()
outputs = gr.Label(num_top_classes=3)

io = gr.Interface(
    fn=predict, inputs=inputs, outputs=outputs, examples=["dog.jpg"]
)
io.launch(inline=False, share=True)

experiment = comet_ml.Experiment()
experiment.add_tag("image-classifier")

io.integrate(comet_ml=experiment)

此代码片段的最后一行会将 Gradio 应用程序的 URL 记录到你的 Comet 实验中。你可以在实验的文本选项卡中找到该 URL。

将 Gradio 面板添加到你的实验以与你的应用程序交互。

2. 将 Gradio 应用程序直接嵌入到你的 Comet 项目中

如果你永久托管你的 Gradio 应用程序,你可以使用 Gradio Panel Extended 自定义面板嵌入 UI。

转到你的 Comet 项目页面,然后前往面板选项卡。单击 + 添加 按钮以调出面板搜索页面。

adding-panels

接下来,在公共面板部分搜索 Gradio Panel Extended,然后单击 添加

gradio-panel-extended

添加面板后,单击 编辑 以访问面板选项页面,并将你的 Gradio 应用程序的 URL 粘贴到其中。

Edit-Gradio-Panel-Options

Edit-Gradio-Panel-URL

3. 将 Hugging Face Spaces 直接嵌入到你的 Comet 项目中

你还可以使用 Hugging Face Spaces 面板将托管在 Hugging Faces Spaces 上的 Gradio 应用程序嵌入到你的 Comet 项目中。

转到你的 Comet 项目页面,然后前往面板选项卡。单击 + 添加 按钮以调出面板搜索页面。接下来,在公共面板部分搜索 Hugging Face Spaces 面板,然后单击 添加

huggingface-spaces-panel

添加面板后,单击编辑以访问面板选项页面,并将你的 Hugging Face Space 的路径粘贴到其中,例如 pytorch/ResNet

Edit-HF-Space

4. 将模型推断记录到 Comet

Open In Colab

在前述示例中,我们演示了通过 Comet UI 与 Gradio 应用程序交互的各种方式。此外,您还可以将模型推断(例如 SHAP 图)从您的 Gradio 应用程序记录到 Comet。

在以下代码片段中,我们将记录来自文本生成模型的推断。我们可以使用 Gradio 的 State 对象在多个推断调用中持久化一个实验 (Experiment)。这将允许您将来自模型的多个推断记录到单个实验 (Experiment) 中。

import comet_ml
import gradio as gr
import shap
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

if torch.cuda.is_available():
    device = "cuda"
else:
    device = "cpu"

MODEL_NAME = "gpt2"

model = AutoModelForCausalLM.from_pretrained(MODEL_NAME)

# set model decoder to true
model.config.is_decoder = True
# set text-generation params under task_specific_params
model.config.task_specific_params["text-generation"] = {
    "do_sample": True,
    "max_length": 50,
    "temperature": 0.7,
    "top_k": 50,
    "no_repeat_ngram_size": 2,
}
model = model.to(device)

tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
explainer = shap.Explainer(model, tokenizer)


def start_experiment():
    """Returns an APIExperiment object that is thread safe
    and can be used to log inferences to a single Experiment
    """
    try:
        api = comet_ml.API()
        workspace = api.get_default_workspace()
        project_name = comet_ml.config.get_config()["comet.project_name"]

        experiment = comet_ml.APIExperiment(
            workspace=workspace, project_name=project_name
        )
        experiment.log_other("Created from", "gradio-inference")

        message = f"Started Experiment: [{experiment.name}]({experiment.url})"

        return (experiment, message)

    except Exception as e:
        return None, None


def predict(text, state, message):
    experiment = state

    shap_values = explainer([text])
    plot = shap.plots.text(shap_values, display=False)

    if experiment is not None:
        experiment.log_other("message", message)
        experiment.log_html(plot)

    return plot


with gr.Blocks() as demo:
    start_experiment_btn = gr.Button("Start New Experiment")
    experiment_status = gr.Markdown()

    # Log a message to the Experiment to provide more context
    experiment_message = gr.Textbox(label="Experiment Message")
    experiment = gr.State()

    input_text = gr.Textbox(label="Input Text", lines=5, interactive=True)
    submit_btn = gr.Button("Submit")

    output = gr.HTML(interactive=True)

    start_experiment_btn.click(
        start_experiment, outputs=[experiment, experiment_status]
    )
    submit_btn.click(
        predict, inputs=[input_text, experiment, experiment_message], outputs=[output]
    )

来自此代码片段的推断将保存在您实验 (Experiment) 的 HTML 选项卡中。

结论

我们希望您觉得本指南对您有所帮助,并为您使用 Comet 和 Gradio 构建出色的模型评估工作流程提供一些灵感。

如何在 Comet 组织的 HF spaces 上贡献 Gradio 演示

  • 在 Hugging Face 上创建一个帐户,请点击这里
  • 在您的用户名下添加 Gradio 演示,请参阅此教程,了解如何在 Hugging Face 上设置 Gradio 演示。
  • 请求加入 Comet 组织,请点击这里

更多资源