零资源跑大模型: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_v1
    litellm_params: 
      model: huggingface/maidalun1020/bce-embedding-base_v1 # 自动路由到 Hugging Face
      api_key: hf_...  # Hugging Face API 密钥
  - model_name: Meta-Llama-3-8B-Instruct
    litellm_params: 
      model: huggingface/meta-llama/Meta-Llama-3-8B-Instruct
      api_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:latest
    container_name: litellm_db
    volumes:
      - ./pgdata:/var/lib/postgresql/data
    env_file:
      - .env
  litellm:
    build:
      context: .
      args:
        target: runtime
    image: ghcr.io/berriai/litellm:main-latest
    depends_on:
      - db
    ports:
      - "4000:4000"
    volumes:
      - ./litellm-config.yaml:/app/config.yaml
    command: [ "--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 json

app = 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 prompt

def 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 string
        image_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 url
    else:
        return None

@app.route('/v1/images/generations', methods=['POST'])
def image_generation():
    # Get the raw data
    raw_data = request.data
    # Decode the raw data into a string
    decoded_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 images
    if 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"}), 500
    else:
        return jsonify({"error": "No prompt provided"}), 400

if __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 来创建一个自定义接口,用于转发并处理各种模型的请求。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

国内免费AI聊天机器人(ChatGPT)推荐(下)含ChatGPT4.0版本

作者主页&#xff1a;点击&#xff01; 国内免费AI推荐专栏&#xff1a;点击&#xff01; 创作时间&#xff1a;2024年5月7日10点39分 现在&#xff0c;国内各种免费AI聊天机器人(ChatGPT)层出不穷&#xff0c;功能强大、玩法多样&#xff0c;可以满足你的不同需求。 今天&a…

深入解析:C语言中的八大经典排序算法全揭秘

目录 排序的概念及运用 排序概念 排序运用 常见排序算法 八大排序详解 直接插入排序 基本思想 代码实现 希尔排序 基本思想 代码实现 选择排序 基本思想 代码实现 堆排序 堆的向下调整算法&#xff08;前提&#xff09; 基本思想 代码实现 冒泡排序 基本思…

springboot+vue+mybatis基于协同过滤算法的新闻推荐系统+PPT+论文+讲解+售后

本系统为用户而设计制作新闻推荐系统&#xff0c;旨在实现新闻推荐智能化、现代化管理。本新闻推荐管理自动化系统的开发和研制的最终目的是将新闻推荐管理的运作模式从手工记录数据转变为网络信息查询管理&#xff0c;从而为现代管理人员的使用提供更多的便利和条件。使新闻推…

【SpringBoot】使用MockMvc+Mockito进行单元测试像德芙一样纵享丝滑!

文章目录 前言&#xff1a;Java常见的单元测试框架一.Junit5基础二.SpringBoot项目单元测试1.添加依赖2.SpringBoot单元测试标准结构3.SpringBoot单元测试常用注解 三.单元测试中如何注入依赖对象1.真实注入&#xff08;AutoWired、 Resource&#xff09;2.Mock注入2.1.前言2.2…

【翻译】Processing系列|(四)用 Android Studio 从 0 到 1 进行 Processing 安卓开发

原文链接&#xff1a;Processing for Android Developing with Android Studio 朋友跟我说官方教程里也写了该怎么用 Android Studio 开发&#xff0c;并且亲测可行。这种方式确实能开发出结构更加清晰、额外组件更加少的程序&#xff0c;比上一篇文章中直接克隆 Processing-An…

90%前端就职小厂,你却说React是国内主流,做人不可以这么扯淡。

有人在自媒体上大放厥词&#xff0c;说赶紧放弃vue&#xff0c;拥抱react吧&#xff0c;vue是过家家的&#xff0c;大厂没有用的&#xff0c;你去问问有多人前端在大厂&#xff0c;做人不可以扯淡。但凡你去调查研究&#xff0c;你就发现大厂很少用vue&#xff0c;同样也很少用…

MySQL安装教程(自定义安装)

参考博主https://blog.csdn.net/m0_71422677/article/details/136007088 一、从mysql官网安装 今天分享的是Windows系统下MySQL的安装教程&#xff0c;打开MySQL官网https://www.mysql.com/downloads/ 这里选择第二个 等待下载完成&#xff0c;下载完成后&#xff0c;双击打开…

微火全域外卖系统是什么?为什么市场占有率这么高?

近日&#xff0c;全域外卖领域又出现了新变动&#xff0c;一个名为微火的品牌凭借着其全域外卖系统&#xff0c;在短短几个月的时间里&#xff0c;就占领了大部分市场。截止发稿日期前&#xff0c;微火全域外卖系统的市场占有率已经超过48%。 据了解&#xff0c;所谓的全域外卖…

使用perf查看热点函数和系统调用最大延迟函数

1、安装perf工具 1.1、ubuntu 18.04 x86下的安装 安装sudo apt install linux-source sudo apt install linux-tools-uname -r # ubuntu 18.04虚拟机实操可行 1.2、ubuntu 18.04 ARM下的安装 参考 Nvidia Jetson系列产品安装Perf ​ARM64版本的Ubuntu上安装perf 与参考文…

24年考研管综199真题PDF共18页

整理了24年考研管综199真题PDF共18页&#xff0c;包含问题求解&#xff0c;条件充分性判断&#xff0c;逻辑推理&#xff0c;写作&#xff0c;几个部分&#xff0c;希望对大家有所帮助 一、问题求解 这部分包含15道小题&#xff0c;每题3分&#xff0c;共45分。题目类型为选择…

一文搞懂大厂商品中心设计!

点击下方“JavaEdge”&#xff0c;选择“设为星标” 第一时间关注技术干货&#xff01; 免责声明~ 任何文章不要过度深思&#xff01; 万事万物都经不起审视&#xff0c;因为世上没有同样的成长环境&#xff0c;也没有同样的认知水平&#xff0c;更「没有适用于所有人的解决方案…

linux的寻找文件

题目 介绍 有一个非常重要的文件 sources.list)但是你忘了 它在哪了&#xff0c;你依稀记得它在 /etc/ 目录下&#xff0c;现在要你 把这个文件找出来&#xff0c;然后设置成自己(shiyanlou 用 户)可以访问&#xff0c;但是其他用户并不能访问。 目标 1.找到 sources.list 文件…

vue3 element-plus表单form验证规则设置的require:true无效

必填项为空校验&#xff0c;valid第一次为true&#xff0c;再点值为false 引入FormInstance &#xff0c;校验代码改为以下&#xff1a; import { ElMessage, FormInstance } from element-plus const ruleFormRef ref<FormInstance>()const submitForm async (formEl:…

23.右值引用_c++11(左值引用的使用场景、右值引用的使用场景、左值引用和右值引用的对比、移动构造、移动赋值、右值引用完美转发)

传统的C语法中就有引用的语法&#xff0c;而C11中新增了的右值引用语法特性&#xff0c;所以从现在开始我们之前学习的引用就叫做左值引用。无论左值引用还是右值引用&#xff0c;都是给对象取别名。 4.右值引用 4.1 左值引用和右值引用 什么是左值&#xff1f;什么是左值引…

AI助力制造行业探索创新路径

近期&#xff0c;著名科技作家凯文凯利&#xff08;K.K.&#xff09;来到中国&#xff0c;发表了一场演讲,给广大听众带来了深刻的启示。他在演讲中强调了人工智能&#xff08;AI&#xff09;对全球经济的重大影响&#xff0c;并提出了AI发展的多个观点&#xff1a; AI的多样性…

Llama 3 超级课堂

https://github.com/SmartFlowAI/Llama3-Tutorial/tree/main 第一节作业 streamlit run web_demo.py /root/share/new_models/meta-llama/Meta-Llama-3-8B-Instruct

计算机网络-IPv6地址配置

前面我们学习了IPv6地址的类型、ICMPv6在IPv6中的应用&#xff0c;现在来看下具体到IPv6的地址配置方式与路由配置。 一、IPV6地址配置过程 前面我们知道单播地址包括&#xff1a;全球单播地址、唯一本地地址、链路本地地址等&#xff0c;一般情况下日常使用较多的是链路本地地…

4000定制网站,因为没有案例,客户走了

接到一个要做企业站点的客户&#xff0c;属于定制开发&#xff0c;预算4000看起来是不是还行的一个订单&#xff1f; 接单第一步&#xff1a;筛客户 从客户询盘的那一刻开始就要围绕核心要素&#xff1a;预算和工期&#xff0c;凡是不符合预期的一律放掉就好了&#xff0c;没必…

基于springboot的校园食堂订餐系统

文章目录 项目介绍主要功能截图&#xff1a;部分代码展示设计总结项目获取方式 &#x1f345; 作者主页&#xff1a;超级无敌暴龙战士塔塔开 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &…

基于参数化建模的3D产品组态实现

我们最近为荷兰设计师家具制造商 KILO 发布了基于网络的 3D 配置器的第一个生产版本。我们使用了 Salsita 3D 配置器&#xff0c;这是一个内部 SDK&#xff0c;使新的 3D 配置器的实施变得轻而易举。虽然它给我们带来了巨大帮助&#xff0c;但我们仍然面临一些有趣的挑战。 NSD…