零资源跑大模型:Hugging Face API + LiteLLM + Flask

前言

HuggingFace 是自然语言处理领域的开源软件库和平台,其收纳了众多最前沿的模型和数据集,并提供了 Serverless Inference API,用户可以轻松调用这些模型,甚至用于运行自己的私人模型。本教程将指导用户如何利用 Hugging Face API 零资源运行这些模型,并结合 LiteLLM 和 Flask 简化调用逻辑,以适配 OpenAI。

教程概要

  • 介绍 Hugging Face Serverless API 的使用方法,包括如何调用嵌入模型文本生成模型对话模型
  • 通过 LiteLLM 转换 Hugging Face 模型为 OpenAI 格式。
  • 使用 Flask 创建一个接口,转发请求并实现自定义逻辑。

Hugging Face

简介

参考文档: Hugging Face API Inference

Serverless Inference API 让用户通过简单的 HTTP 请求即可免费测试和评估超过 15 万个公开的机器学习模型,以及使用自己的私人模型。推理由 Hugging Face 提供的共享基础设施加速。

  • 免费使用:推理 API 免费提供使用,并且有速率限制。需要用于生产环境的推理解决方案,可使用 Inference Endpoints 服务。
  • 主要特点
    • 支持超过 15 万个 Transformers、Diffusers 或 Timm 模型。
    • 内置集成 20 多个开源库,如 spaCy、SpeechBrain、Keras 等。
    • 模型切换方便,通过切换模型 ID 即可。
    • 支持多种任务,如分类、图像分割、语音识别、对话、摘要、翻译、问答、嵌入提取等。
    • 基于 Intel Xeon Ice Lake 提供加速推理。

用户可通过 Inference Endpoints 标签 筛选支持 Inference API 的模型。

文生图模型

示例模型:stable-diffusion-xl-base-1.0

调用方式:

prompt="Imagine a delightful scene found in a children'\''s book. There'\''s a playful puppy with its adorable features exaggerated in classic cartoon style. Its fur is a soft golden color, with a pair of sparkling eyes full of curiosity. Its tail, bushy and wagging, is an embodiment of its joyful nature. The puppy is in a typical playful stance, a chew toy in its mouth and its tongue hanging out. The scene is set in a homely backyard with green grass and plenty colorful flowers, and a bright sun up in the sky, resulting in a warm, inviting atmosphere."curl https://api-inference.huggingface.co/models/stabilityai/stable-diffusion-xl-base-1.0 \-X POST \-d '{"inputs": "$prompt"}' \-H 'Content-Type: application/json' \-H "Authorization: Bearer $HF_TOKEN" \--output puppy.jpeg

返回二进制图片数据,输出到指定文件。

输出效果:
puppy

嵌入模型

以网易有道推出的 BCEmbedding 模型为例,先找到 Hugging Face 的地址:

  • maidalun1020/bce-embedding-base_v1

调用方法:

curl https://api-inference.huggingface.co/models/maidalun1020/bce-embedding-base_v1 \-X POST \-d '{"inputs": "Today is a sunny day and I will get some ice cream."}' \-H 'Content-Type: application/json' \-H "Authorization: Bearer $HF_TOKEN"

返回结果:

[-0.0015705720288679004,0.008027488365769386,...]

还可用列表形式调用:

curl https://api-inference.huggingface.co/models/maidalun1020/bce-embedding-base_v1 \-X POST \-d '{"inputs": ["Today is a sunny day and I will get some ice cream.", ...]}' \-H 'Content-Type: application/json' \-H "Authorization: Bearer $HF_TOKEN"

文本生成模型

以 MetaAI 的 Llama3 为例:

  • HuggingFace 地址:meta-llama/Meta-Llama-3-8B-Instruct

调用方式:

curl https://api-inference.huggingface.co/models/meta-llama/Meta-Llama-3-8B-Instruct \-X POST \-d '{"inputs": "hello"}' \-H 'Content-Type: application/json' \-H "Authorization: Bearer $HF_TOKEN"

返回结果:

[{"generated_text":"hello! i am a junior high school student, and i am really interested in history..."}]

LiteLLM

简介

LiteLLM 项目 为主流的模型服务提供统一的调用方式。功能包括:

  • 标准化接口:调用超过 100 种 LLM 模型,提供统一的输入/输出格式。
  • 接口转换:支持将输入翻译成提供商的文本生成、嵌入和图像生成端点。
  • 多部署重试/后备机制:可以在多个部署(如 Azure/OpenAI)之间重试或切换。
  • 预算和速率限制:可为项目、API 密钥或模型设置预算和速率限制。
  • 跟踪开销:可监控项目花费,并设置预算限制。

安装

通过 pip 安装:

pip install litellm

如果希望将 LiteLLM 服务部署成类似 OneAPI 的形式,并带有 UI 管理界面,则用以下方式进行安装:

git clone https://github.com/BerriAI/litellm.git
cd litellm
pip install 'litellm[proxy]'

启动服务:

litellm

可参阅完整的参数文档:CLI Arguments

配置文件

为 litellm 添加下游模型并设置转发规则,参考文档:

  • Proxy 配置
  • 支持的模型类型。

配置文件中有五个主要设置:

参数名描述
model_list服务器上支持的模型列表及其特定配置
router_settingsLiteLLM 路由设置,如 routing_strategy="least-busy"
litellm_settingsLiteLLM 模块设置,如 litellm.drop_params=Truelitellm.set_verbose=Truelitellm.api_base
general_settings服务器设置,如 master_key: sk-my_special_key
environment_variables环境变量,如 REDIS_HOSTREDIS_PORT

项目仓库下的 proxy_server_config.yaml 提供了完整的示例配置文件。以下示例用于配置 Hugging Face 模型:

model_list:- model_name: bce-embedding-base_v1litellm_params: model: huggingface/maidalun1020/bce-embedding-base_v1 # 自动路由到 Hugging Faceapi_key: hf_...  # Hugging Face API 密钥- model_name: Meta-Llama-3-8B-Instructlitellm_params: model: huggingface/meta-llama/Meta-Llama-3-8B-Instructapi_key: hf_...general_settings: master_key: sk-1234  # 调用的密钥,也是管理员登录密码# 如果配置 UI 界面,需数据库支持store_model_in_db: True database_url: "postgresql://<user>:<password>@<host>:<port>/<dbname>"  # [可选] 用于代理的数据库支持

参数说明:

  • master_key 作为调用的密钥,也作为管理员的登录密码
  • store_model_in_db 保存在线的模型修改
  • database_url UI 界面的管理需要数据库支持

Docker 配置

如果希望避免手动配置 Python 环境和数据库,官方提供了 Docker 部署方式。文档:Docker 部署。

以下是个人经过调整并验证有效的 docker-compose.yaml

version: "3.9"
services:db:image: postgres:latestcontainer_name: litellm_dbvolumes:- ./pgdata:/var/lib/postgresql/dataenv_file:- .envlitellm:build:context: .args:target: runtimeimage: ghcr.io/berriai/litellm:main-latestdepends_on:- dbports:- "4000:4000"volumes:- ./litellm-config.yaml:/app/config.yamlcommand: [ "--config", "/app/config.yaml", "--port", "4000", "--num_workers", "8", "--detailed_debug" ]env_file:- .env

.env 文件的内容:

# Postgres 配置
POSTGRES_USER=
POSTGRES_PASSWORD=
POSTGRES_DB=
# LiteLLM 配置
LITELLM_MASTER_KEY="" # 主密钥,用于代理服务器
UI_USERNAME=""   # UI 界面的用户名
UI_PASSWORD=""      # UI 界面的密码
STORE_MODEL_IN_DB='True'
# 默认端口 5432,用户名密码需与上面的 POSTGRES_USER 和 POSTGRES_PASSWORD 一致
DATABASE_URL="postgresql://<user>:<password>@<host>:<port>/<dbname>"

Flask

简介

HuggingFace 的文生图接口返回的是二进制图片数据,我们可以使用 Flask 结合 Nginx 代理,将结果以链接形式返回。

下面的代码段展示了如何实现这个功能,将数据保存在 /storage/dalle3/ 目录下,并通过 CDN 链接返回。

from flask import Flask, request, jsonify
import requests, os, io, uuid
from datetime import datetime
from PIL import Image
import jsonapp = Flask(__name__)
HF_TOKEN = "hf_xxx"
HF_MODEL_ID = "ehristoforu/dalle-3-xl-v2"
HUGGING_FACE_API_URL = f"https://api-inference.huggingface.co/models/{HF_MODEL_ID}"
IMAGE_SAVE_DIR = "/storage/dalle3/"
CDN_PREFIX = "https://cdn.example.com/dalle3"def prompt_revision(prompt):# 自定义规则,将用户的 Prompt 进行优化,对图像进行更细致的描述return promptdef generate_images(prompt):headers = {"Authorization" : f"Bearer {HF_TOKEN}"}response = requests.post(HUGGING_FACE_API_URL, headers=headers, json={"inputs": prompt})if response.status_code == 200:timestamp = datetime.now().strftime("%Y%m%d%H%M%S") # Generate timestamp stringimage_path = os.path.join(IMAGE_SAVE_DIR, f"{timestamp}_{uuid.uuid4()[:8]}.jpeg")image = Image.open(io.BytesIO(response.content))image.save(image_path, "JPEG")url = f"{CDN_PREFIX}/{os.path.basename(image_path)}"return urlelse:return None@app.route('/v1/images/generations', methods=['POST'])
def image_generation():# Get the raw dataraw_data = request.data# Decode the raw data into a stringdecoded_data = raw_data.decode('utf-8')data = json.loads(decoded_data)prompt = data.get("prompt", "")n = data.get("n", 1) # Number of images to generate, TODO: support multiple imagesif prompt:revised_prompt = prompt_revision(prompt)url = generate_images(revised_prompt)if url:return jsonify({"created": int(datetime.now().timestamp()),"revised_prompt": revised_prompt,"data": [{"url": url}],})else:return jsonify({"error": "Failed to generate images"}), 500else:return jsonify({"error": "No prompt provided"}), 400if __name__ == '__main__':app.run(host='0.0.0.0', port=8080)

将文件保存为 dalle3.py 并启动模型:

# pip install gunicorn
gunicorn -w 4 -b 127.0.0.1:8080 dalle3:app

接着我们可以通过 Nginx 配置返回的 CDN 链接,如下所示:

server {listen 443 ssl;server_name cdn.example.com;# SSL 证书配置location /dalle3/ {alias /storage/dalle3/;}
}

最后,通过 OpenAI 接口的方式调用:

curl https://cdn.example.com/v1/images/generations \-H "Content-Type: application/json" \-H "Authorization: Bearer $OPENAI_API_KEY" \-d '{"model": "dall-e-3", "prompt": "..."}'

以上,通过 Hugging Face、LiteLLM 和 Flask 来创建一个自定义接口,用于转发并处理各种模型的请求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/7964.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ之消费者并发消费

为什么要引入消费者的并发消费&#xff1f; 当生产者的推送速度是远远超过消费者的能力的&#xff0c;可以提高消费者的消费速度。比如在java中我们可以启动多个 JVM 进程&#xff0c;实现多进程的并发消费&#xff0c;从而加速消费的速度&#xff0c;在mq中也可以通过设置配置…

鸿蒙内核源码分析(进程通讯篇) | 九种进程间通讯方式速揽

进程间为何要通讯 ? 鸿蒙内核默认支持 64个进程和128个任务&#xff0c;由进程池和任务池统一管理.内核设计尽量不去打扰它们&#xff0c;让各自过好各自的日子&#xff0c; 但大家毕竟在一口锅里吃饭&#xff0c; 不可能不与外界联系&#xff0c; 联系就得有渠道&#xff0c…

Go微服务精讲:Go-Zero全流程实战即时通讯(超清)

go-zero 是一个集成了各种工程实践的 web 和 rpc 框架。通过弹性设计保障了大并发服务端的稳定性&#xff0c;经受了充分的实战检验。 Go微服务精讲&#xff1a;Go-Zero全流程实战即时通讯(超清) go-zero 中的 api&#xff0c;rpc&#xff0c;数据库等涉及的代码&#xff0c;…

C#标签设计打印软件开发

1、新建自定义C#控件项目Custom using System; using System.Collections.Generic; using System.Text;namespace CustomControls {public class CommonSettings{/// <summary>/// 把像素换算成毫米/// </summary>/// <param name"Pixel">多少像素…

Springboot 集成 Consul 实现服务注册中心-05

因为后续很多模块都要用到注册中心&#xff0c;所以此处先实现此模块。 Consul简介 Consul是一个开源的服务发现和配置管理工具&#xff0c;具有跨平台、运行高效等特点。它由HashiCorp公司开发&#xff0c;并使用Go语言编写。Consul主要用于实现分布式系统中的服务发现、健康…

解决Node.js mysql客户端不支持认证协议引发的“ER_NOT_SUPPORTED_AUTH_MODE”问题

这是一个版本问题 我用koa2和mysql2链接就没有问题 不知道这个老项目运行为啥有这个问题 解决方案 打开mysql运行这个两个命令&#xff1a; ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 123321; FLUSH PRIVILEGES; 须知(给小白看的&#xff01;) …

优立科技:从数字孪生到元宇宙

2021年10月&#xff0c;Facebook致力于发展元宇宙&#xff0c;并更名为Meta。加上此前Roblox上市的消息&#xff0c;让「元宇宙」一词迅速在2021年爆火&#xff0c;刺激了VR、游戏等相关产业的发展&#xff0c;甚至有人宣称2021年为「元宇宙『元年』」。然而&#xff0c;「元年…

YOLOv8的训练、验证、预测及导出[目标检测实践篇]

这一部分内容主要介绍如何使用YOLOv8训练自己的数据集&#xff0c;并进行验证、预测及导出&#xff0c;采用代码和指令的两种方式&#xff0c;参考自官方文档&#xff1a;Detect - Ultralytics YOLOv8 Docs。实践篇不需要关注原理&#xff0c;只需要把流程跑通就行&#xff0c;…

信号产生的五种方式

文章目录 正文前的知识准备kill 命令查看信号man手册查看信号信号的处理方法 认识信号产生的5种方式1. 工具2. 键盘3. 系统调用kill 向任意进程发送任意信号raise 给调用方发送任意信号abort 给调用方发送SIGABRT信号 4. 软件条件5. 异常 正文前的知识准备 kill 命令查看信号 …

构建 WebRTC 一对一信令服务器

构建 WebRTC 一对一信令服务器 构建 WebRTC 一对一信令服务器前言为什么选择 Nodejs&#xff1f;Nodejs 的基本原理浏览器使用 Nodejs安装 Nodejs 和 NPMsocket.io信令服务器搭建信令服务器客户端服务端启动服务器并测试 总结参考 构建 WebRTC 一对一信令服务器 前言 我们在学…

Jmeter页面汉化和字体显示过小调整

在频繁解压使用Jmeter的时候&#xff0c;经常会遇到需要将页面的英文调整为中文&#xff0c;页面文字和编辑区域内容文字显示较小的问题&#xff0c;记录一下方便以后查阅。 1.页面汉化 Jmeter在解压启动之后页面显示是英文&#xff0c;如果需要修改为中文&#xff0c;可以修改…

uniapp的app端软件更新弹框

1&#xff1a;使用html PLUS实现&#xff1a;地址HTML5 API Reference (html5plus.org)&#xff0c;效果图 2&#xff1a;在app.vue的onLaunch生命周期中&#xff0c;代码如下&#xff1a; onLaunch: function() {let a 0let view new plus.nativeObj.View(maskView, {backg…

YOLOv5改进 | 主干篇 | 2024.5全新的移动端网络MobileNetV4改进YOLOv5(含MobileNetV4全部版本改进)

一、本文介绍 本文给大家带来的改进机制是MobileNetV4&#xff0c;其发布时间是2024.5月。MobileNetV4是一种高度优化的神经网络架构&#xff0c;专为移动设备设计。它最新的改动总结主要有两点&#xff0c;采用了通用反向瓶颈&#xff08;UIB&#xff09;和针对移动加速器优化…

AI烟雾监测识别摄像机:智能化安全防范的新利器

随着现代社会的不断发展&#xff0c;人们对于安全问题的关注日益增加&#xff0c;尤其是在日常生活和工作中&#xff0c;对火灾等意外事件的预防成为了一项重要任务。为了更好地应对火灾风险&#xff0c;近年来&#xff0c;AI烟雾监测识别摄像机应运而生&#xff0c;成为智能化…

【深度学习】实验1 波士顿房价预测

波士顿房价预测 代码 import numpy as np import matplotlib.pyplot as pltdef load_data():# 1.从文件导入数据datafile D:\Python\PythonProject\sklearn\housing.datadata np.fromfile(datafile, sep )# 每条数据包括14项&#xff0c;其中前面13项是影响因素&#xff0c…

微软正在自主构建一个名为 MAI-1 的大型语言模型(不依赖 OpenAI)

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

所向披靡のmakefile

在VS里敲代码&#xff0c;只需要FnF5就可以直接运行勒&#xff0c;在Linux下敲代码却要即敲命令还要用编辑器还要用编译器&#xff0c;那在Linux下有没有能帮我们进行自动化组建的工具呢&#xff1f; 当然有&#xff0c;超级巨星&#xff1a;makefile&#xff01;&#xff01;…

Dropout作为贝叶斯近似: 表示深度学习中的模型不确定性

摘要 深度学习工具在应用机器学习领域受到了极大的关注。然而&#xff0c;这些用于回归和分类的工具并没有捕捉到模型的不确定性。相比之下&#xff0c;贝叶斯模型提供了一个基于数学的框架来推理模型的不确定性&#xff0c;但通常会带来令人望而却步的计算成本。本文提出了一…

面试中算法(删去n个数字后的最小值)

有一个整数&#xff0c;从该整数中去掉n个数字&#xff0c;要求剩下的数字形成的新整数尽可能小。 分析&#xff1a;使用栈的特性&#xff0c;在遍历原整数的数字时&#xff0c;让所有数字一个一个入栈&#xff0c;当某个数字需要被删除时&#xff0c;&#xff08;即栈顶数字&g…

【记录】Python3| 将 PDF 转换成 HTML/XML(✅⭐PyMuPDF+tqdm)

本文将会被汇总至 【记录】Python3&#xff5c;2024年 PDF 转 XML 或 HTML 的第三方库的使用方式、测评过程以及对比结果&#xff08;汇总&#xff09;&#xff0c;更多其他工具请访问该文章查看。 文章目录 PyMuPDF 使用体验与评估1 安装指南2 测试代码3 测试结果3.1 转 HTML …