Gradio 月活用户突破 100 万!
阅读更多Gradio 月活用户突破 100 万!
阅读更多本指南解释了如何从你的 Gradio 应用中运行后台任务。后台任务是指你希望在应用的请求-响应生命周期之外执行的操作,可以是一次性的,也可以是周期性的。后台任务的示例包括定期将数据同步到外部数据库,或通过电子邮件发送模型预测报告。
我们将创建一个简单的“Google 表单风格”的应用程序,以收集 Gradio 库用户的反馈。我们将使用本地 sqlite 数据库来存储数据,但我们将定期将数据库的状态与 HuggingFace Dataset 同步,以便始终备份我们的用户评论。同步将在每 60 秒运行一次的后台任务中进行。
在演示结束时,你将拥有一个像这样的完全可用的应用程序
我们的应用程序将存储评论者的姓名、他们对 Gradio 的评分(1 到 5 分),以及他们想要分享的关于该库的任何评论。让我们编写一些代码来创建一个数据库表来存储这些数据。我们还将编写一些函数来将评论插入到该表中并获取最新的 10 条评论。
我们将使用 sqlite3
库连接到我们的 sqlite 数据库,但 gradio 可以与任何库一起使用。
代码将如下所示
DB_FILE = "./reviews.db"
db = sqlite3.connect(DB_FILE)
# Create table if it doesn't already exist
try:
db.execute("SELECT * FROM reviews").fetchall()
db.close()
except sqlite3.OperationalError:
db.execute(
'''
CREATE TABLE reviews (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
name TEXT, review INTEGER, comments TEXT)
''')
db.commit()
db.close()
def get_latest_reviews(db: sqlite3.Connection):
reviews = db.execute("SELECT * FROM reviews ORDER BY id DESC limit 10").fetchall()
total_reviews = db.execute("Select COUNT(id) from reviews").fetchone()[0]
reviews = pd.DataFrame(reviews, columns=["id", "date_created", "name", "review", "comments"])
return reviews, total_reviews
def add_review(name: str, review: int, comments: str):
db = sqlite3.connect(DB_FILE)
cursor = db.cursor()
cursor.execute("INSERT INTO reviews(name, review, comments) VALUES(?,?,?)", [name, review, comments])
db.commit()
reviews, total_reviews = get_latest_reviews(db)
db.close()
return reviews, total_reviews
让我们也编写一个函数,在 gradio 应用程序加载时加载最新的评论
def load_data():
db = sqlite3.connect(DB_FILE)
reviews, total_reviews = get_latest_reviews(db)
db.close()
return reviews, total_reviews
现在我们已经定义了数据库逻辑,我们可以使用 gradio 创建一个动态网页来向用户征求反馈!
with gr.Blocks() as demo:
with gr.Row():
with gr.Column():
name = gr.Textbox(label="Name", placeholder="What is your name?")
review = gr.Radio(label="How satisfied are you with using gradio?", choices=[1, 2, 3, 4, 5])
comments = gr.Textbox(label="Comments", lines=10, placeholder="Do you have any feedback on gradio?")
submit = gr.Button(value="Submit Feedback")
with gr.Column():
data = gr.Dataframe(label="Most recently created 10 rows")
count = gr.Number(label="Total number of reviews")
submit.click(add_review, [name, review, comments], [data, count])
demo.load(load_data, None, [data, count])
在步骤 2 之后,我们可以调用 demo.launch()
并拥有一个功能齐全的应用程序。但是,我们的数据将本地存储在我们的机器上。如果 sqlite 文件意外删除,我们将丢失所有评论!让我们将数据备份到 HuggingFace Hub 上的数据集。
在继续之前,在此处 创建一个数据集。
现在,在脚本的顶部,我们将使用 huggingface hub client library 连接到我们的数据集并拉取最新的备份。
TOKEN = os.environ.get('HUB_TOKEN')
repo = huggingface_hub.Repository(
local_dir="data",
repo_type="dataset",
clone_from="<name-of-your-dataset>",
use_auth_token=TOKEN
)
repo.git_pull()
shutil.copyfile("./data/reviews.db", DB_FILE)
请注意,你必须从 HuggingFace 的“Settings”选项卡获取访问令牌,上述代码才能工作。在脚本中,令牌通过环境变量安全地访问。
现在,我们将创建一个后台任务,每 60 秒将本地数据库同步到 dataset hub。我们将使用 AdvancedPythonScheduler 来处理调度。但是,这并不是唯一可用的任务调度库。请随意使用你觉得舒适的任何库。
备份数据的函数将如下所示
from apscheduler.schedulers.background import BackgroundScheduler
def backup_db():
shutil.copyfile(DB_FILE, "./data/reviews.db")
db = sqlite3.connect(DB_FILE)
reviews = db.execute("SELECT * FROM reviews").fetchall()
pd.DataFrame(reviews).to_csv("./data/reviews.csv", index=False)
print("updating db")
repo.push_to_hub(blocking=False, commit_message=f"Updating data at {datetime.datetime.now()}")
scheduler = BackgroundScheduler()
scheduler.add_job(func=backup_db, trigger="interval", seconds=60)
scheduler.start()
你可以使用 HuggingFace Spaces 平台来免费部署此应用程序 ✨
如果你之前没有使用过 Spaces,请按照此处的上一个指南进行操作。你将必须在指南中使用 HUB_TOKEN
环境变量作为密钥。
恭喜!你现在知道如何在你的 gradio 应用程序中按计划运行后台任务了 ⏲️。