在本指南中,我们将演示一些您可以将Gradio与Comet结合使用的方式。我们将介绍使用Comet与Gradio的基础知识,并向您展示一些利用Gradio高级功能(如嵌入iFrame和状态)来构建一些令人惊叹的模型评估工作流的方法。
以下是本指南涵盖的主题列表。
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笔记本来运行这些示例,请在启动Gradio UI之前运行包含以下代码段的单元格。运行此单元格可以让您以交互方式将API密钥添加到笔记本中。
import comet_ml
comet_ml.init()在这个例子中,我们将介绍如何将你的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面板添加到您的实验中,以便与您的应用程序进行交互。
如果您永久托管您的Gradio应用程序,您可以使用Gradio Panel Extended自定义面板嵌入UI。
转到您的Comet项目页面,然后前往面板选项卡。点击+ 添加按钮以打开面板搜索页面。
接下来,在公共面板部分搜索 Gradio Panel Extended 并点击 Add。
添加面板后,点击Edit以访问面板选项页面,并粘贴您的Gradio应用程序的URL。

您还可以使用Hugging Face Spaces面板将托管在Hugging Faces Spaces上的Gradio应用程序嵌入到您的Comet项目中。
转到您的Comet项目页面,然后前往面板选项卡。点击+ 添加按钮以打开面板搜索页面。接下来,在公共面板部分搜索Hugging Face Spaces面板,然后点击添加。
一旦您添加了您的面板,点击编辑以访问面板选项页面,并粘贴您的Hugging Face空间的路径,例如 pytorch/ResNet
在前面的示例中,我们演示了通过Comet UI与Gradio应用程序进行交互的各种方式。此外,您还可以将模型推断(如SHAP图)从Gradio应用程序记录到Comet中。
在以下代码片段中,我们将记录来自文本生成模型的推理。我们可以使用Gradio的State对象在多个推理调用之间持久化一个实验。这将允许您将模型的多个推理记录到单个实验中。
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]
)从此代码片段中得出的推断将保存在您实验的HTML选项卡中。
我们希望您觉得本指南有用,并希望它能为您提供一些灵感,帮助您使用Comet和Gradio构建出色的模型评估工作流程。