【AI】在本地 Docker 环境中搭建使用 Hugging Face 托管的 Llama 模型

news/2024/4/28 23:40:28/文章来源:https://blog.csdn.net/ouyangtianhan/article/details/137107566

目录

    • Hugging Face 和 LLMs 简介
      • 利用 Docker 进行 ML
      • 格式的类型
      • 请求 Llama 模型访问
      • 创建 Hugging Face 令牌
      • 设置 Docker 环境
    • 快速演示
      • 访问页面
    • 入门
      • 克隆项目
      • 构建镜像
      • 运行容器
    • 结论

推荐超级课程:

  • Docker快速入门到精通
  • Kubernetes入门到大师通关课
  • AWS云服务快速入门实战

Hugging Face 已经成为机器学习(ML)领域的强大力量。他们大量的预训练模型和用户友好的接口彻底改变了我们对人工智能/机器学习部署和空间的看法。如果你对深入了解 Docker 和 Hugging Face 模型的集成感兴趣,可以在文章“使用 Hugging Face 的 Docker Spaces 构建机器学习应用”中找到一份全面的指南。

大语言模型(LLM)——语言生成的奇迹——是一个令人惊叹的发明。在本文中,我们将探讨如何在 Docker 环境中使用 Hugging Face 托管的 Llama 模型,为自然语言处理(NLP)爱好者和研究人员开辟新的机会。
在这里插入图片描述

Hugging Face 和 LLMs 简介

Hugging Face(HF)为训练、微调和部署ML 模型提供了一个综合平台。而 LLMS 则提供了一种能够执行文本生成、补全和分类等任务的尖端模型。

利用 Docker 进行 ML

强大的Docker容器化技术使程序的打包、分发和运行变得更加简单。将 ML 模型封装在 Docker 容器中确保了在不同环境下模型的一致运行。这样就能保证可重现性,解决了“在我的机器上可以运行”的问题。

格式的类型

Hugging Face 上的大多数模型有两种选择:

  • GPTQ(通常是 4 位或 8 位,仅适用于 GPU)
  • GGML(通常是 4、5、8 位,CPU/GPU 混合)

AI 模型量化中使用的示例量化技术包括 GGML 和 GPTQ 模型。这可以意味着在训练期间或训练之后的量化。通过将模型权重减少到较低的精度,GGML 和 GPTQ 模型——两个众所周知的量化模型——减少了模型大小和计算需求。

HF 模型加载在 GPU 上,相比 CPU 执行推断要快得多。一般来说,这种模型非常庞大,你也需要很多 GPU 内存。在本文中,我们将使用 GGML 模型,该模型在 CPU 上运行良好,如果你没有一个好的 GPU,它可能会更快。

在本次演示中,我们还将使用 transformers 和 ctransformers,因此让我们先了解一下它们:

  • transformers:现代预训练模型可以通过 transformers 的 API 和工具轻松下载并训练。通过使用预先训练的模型,你可以减少从头开始训练模型所需的时间和资源,以及计算开销和碳足迹。
  • ctransformers:使用 GGML 库开发的 C/C++ 中的 transformer 模型的 Python 绑定。

请求 Llama 模型访问

我们将利用 Meta Llama 模型,注册并请求访问。

创建 Hugging Face 令牌

要创建将来使用的访问令牌,请转到你的 Hugging Face 个人资料设置,并从左侧边栏选择 访问令牌(图 1)。保存创建的访问令牌的值。

Hugging Face 个人资料设置的屏幕截图;选择访问令牌。

图 1. 生成访问令牌。

设置 Docker 环境

在探索 LLM 领域之前,我们必须首先配置 Docker 环境。首先安装 Docker,根据你的操作系统在官方Docker 网站上按照说明进行。安装完成后,执行以下命令以确认你的设置:

docker --version

快速演示

以下命令将使用 Hugging Face 的 harsh-manvar-llama-2-7b-chat-test:latest 映像运行一个容器,并将容器的端口 7860 暴露到主机机器。它还将设置环境变量 HUGGING_FACE_HUB_TOKEN 为你提供的值。

docker run -it -p 7860:7860 --platform=linux/amd64 \-e HUGGING_FACE_HUB_TOKEN="YOUR_VALUE_HERE" \registry.hf.space/harsh-manvar-llama-2-7b-chat-test:latest python app.py
  • -it 标志告诉 Docker 以交互模式运行容器并将终端附加到它。这将允许你与容器及其进程进行交互。
  • -p 标志告诉 Docker 将容器的端口 7860 暴露到主机机器。这意味着你将能够在主机机器的端口 7860 上访问容器的 Web 服务器。
  • --platform=linux/amd64 标志告诉 Docker 在具有 AMD64 架构的 Linux 机器上运行容器。
  • -e HUGGING_FACE_HUB_TOKEN="YOUR_VALUE_HERE" 标志告诉 Docker 将环境变量 HUGGING_FACE_HUB_TOKEN 设置为你提供的值。这对于从容器中访问 Hugging Face 模型是必需的。

app.py 脚本是你要在容器中运行的 Python 脚本。这将启动容器并打开一个终端。然后你可以在终端中与容器及其进程进行交互。要退出容器,请按 Ctrl+C

访问页面

要访问容器的 Web 服务器,请打开 Web 浏览器并导航至 http://localhost:7860。你应该会看到 Hugging Face 模型的初始页面(图 2)。

打开你的浏览器并转至http://localhost:7860。

本地 Docker llm 的初始页面截图,欢迎消息上写着:“你好,很高兴见到你。我可以帮你什么呢?还是想聊天吗?

图 2. 访问本地 Docker LLM。

入门

克隆项目

要开始,你可以克隆或下载 Hugging Face 现有的space/repository。

git clone https://huggingface.co/spaces/harsh-manvar/llama-2-7b-chat-test

文件: requirements.txt

requirements.txt 文件是一个列出项目需要运行的 Python 包和模块的文本文件。它用于管理项目的依赖项并确保所有开发人员使用的都是所需包的相同版本。

为了运行 Hugging Face 的 llama-2-13b-chat 模型,需要以下 Python 包。请注意,这个模型很大,可能需要一些时间来下载和安装。你可能还需要增加分配给 Python 进程的内存以运行该模型。

gradio==3.37.0
protobuf==3.20.3
scipy==1.11.1
torch==2.0.1
sentencepiece==0.1.99
transformers==4.31.0
ctransformers==0.2.27

文件: Dockerfile

FROM python:3.9
RUN useradd -m -u 1000 user
WORKDIR /code
COPY ./requirements.txt /code/requirements.txt
RUN pip install --upgrade pip
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
USER user
COPY --link --chown=1000 ./ /code

接下来的部分将对 Dockerfile 进行详细说明。第一行告诉 Docker 使用官方的 Python 3.9 镜像作为我们镜像的基础镜像:

FROM python:3.9

接下来的一行使用用户 ID 1000 创建一个名为 user 的新用户。-m 标志告诉 Docker 为用户创建一个 home 目录。

RUN useradd -m -u 1000 user

接下来,这一行将容器的工作目录设置为 /code

WORKDIR /code

现在将 requirements 文件从当前目录复制到容器中的 /code 目录中。此外,该行升级容器中的 pip 软件包管理器。

RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt

这一行将容器的默认用户设置为 user。

USER user

下一行将当前目录的内容复制到容器中的 /code 目录中。--link 标志告诉 Docker 创建硬链接而不是复制文件,这可以提高性能并减小镜像的大小。--chown=1000 标志告诉 Docker 将拷贝文件的所有权更改为用户 user。

COPY --link --chown=1000 ./ /code

构建了 Docker 镜像之后,你可以使用 docker run 命令运行它。这将以非 root 用户 user 运行 Python 3.9 镜像的新容器。然后你可以使用终端与容器进行交互。

文件: app.py

这段 Python 代码展示了如何使用 Gradio 创建一个使用 transformers 训练的文本生成模型的演示。该代码允许用户输入文本提示并生成文本的延续。

Gradio 是一个 Python 库,使您可以轻松创建和分享交互式机器学习演示。它提供了一个简单直观的界面来创建和部署演示,并支持多种机器学习框架和库,包括 transformers。

这个 Python 脚本是一个文本聊天机器人的 Gradio 演示。它使用一个预训练的文本生成模型来生成用户输入的响应。我们将对文件进行拆分,并查看每个部分。

以下行从 typing 模块导入 Iterator 类型。这种类型用于表示可以遍历的值序列。下一行也导入了 gradio 库。

from typing import Iterator
import gradio as gr

接下来的一行从 transformers 库导入 logging 模块,该库是一个流行的自然语言处理机器学习库。

from transformers.utils import logging
from model import get_input_token_length, run

接下来的一行从 model 模块中导入 get_input_token_length()run() 函数。这些函数用于计算文本的输入令牌长度和使用预训练文本生成模型生成文本,分别。接下来的两行配置了 logging 模块,以打印信息级别消息并使用 transformers 记录器。

from model import get_input_token_length, runlogging.set_verbosity_info()
logger = logging.get_logger("transformers")

以下行定义了在代码中使用的一些常量。还有定义在 Gradio 演示中显示的文本。

DEFAULT_SYSTEM_PROMPT = """"""
MAX_MAX_NEW_TOKENS = 2048
DEFAULT_MAX_NEW_TOKENS = 1024
MAX_INPUT_TOKEN_LENGTH = 4000DESCRIPTION = """"""LICENSE = """"""

这行记录一个信息级别消息,指示代码正在启动。该函数清除文本框并将输入消息保存到 saved_input 状态变量中。

logger.info("Starting")
def clear_and_save_textbox(message: str) -> tuple[str, str]:return '', message

以下函数显示输入消息的聊天机器人,并将消息添加到聊天历史记录中。

def display_input(message: str,history: list[tuple[str, str]]) -> list[tuple[str, str]]:history.append((message, ''))logger.info("display_input=%s",message)             return history

此函数从聊天历史记录中删除之前的响应,并返回已更新的聊天历史记录和之前的响应。

def delete_prev_fn(history

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

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

相关文章

7、鸿蒙学习-共享包概述

HarmonyOS提供了两种共享包,HAR(Harmony Archive)静态共享包,和HSP(Harmony Shared Package)动态共享包。 HAR与HSR都是为了实现代码和资源的共享,都可以包含代码、C库、资源和配置文件&#xf…

iPhone用GPT替代Siri

shigen坚持更新文章的博客写手,擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长,分享认知,留住感动。 个人IP:shigen 前一段时间,因为iCloud协议的更新,我的云盘空间无法正常…

RISC-V特权架构 - 中断定义

RISC-V特权架构 - 中断定义 1 中断类型1.1 外部中断1.2 计时器中断1.3 软件中断1.4 调试中断 2 中断屏蔽3 中断等待4 中断优先级与仲裁5 中断嵌套6 异常相关寄存器 本文属于《 RISC-V指令集基础系列教程》之一,欢迎查看其它文章。 1 中断类型 RISC-V 架构定义的中…

helm 部署 Kube-Prometheus + Grafana + 钉钉告警部署 Kube-Prometheus

背景 角色IPK8S 版本容器运行时k8s-master-1172.16.16.108v1.24.1containerd://1.6.8k8s-node-1172.16.16.109v1.24.1containerd://1.6.8k8s-node-2172.16.16.110v1.24.1containerd://1.6.8 安装 kube-prometheus mkdir -p /data/yaml/kube-prometheus/prometheus &&…

CDH集群hive初始化元数据库失败

oracle数据库操作: 报错如下:命令 (Validate Hive Metastore schema (237)) 已失败 截图如下: 后台日志部分摘录: WARNING: Use “yarn jar” to launch YARN applications. SLF4J: Class path contains multiple SLF4J binding…

UE RPC 外网联机(1)

技术&#xff1a;RPC TCP通信 设计&#xff1a;大厅服务<---TCP--->房间服务<---RPC--->客户端&#xff08;Creator / Participator&#xff09; 1. PlayerController 用于RPC通信控制 2.GameMode 用于数据同步 3.类图 4. 注意 &#xff08;1&#xff09;RPC&a…

机器学习之决策树现成的模型使用

目录 须知 DecisionTreeClassifier sklearn.tree.plot_tree cost_complexity_pruning_path(X_train, y_train) CART分类树算法 基尼指数 分类树的构建思想 对于离散的数据 对于连续值 剪枝策略 剪枝是什么 剪枝的分类 预剪枝 后剪枝 后剪枝策略体现之威斯康辛州乳…

GIMP - GNU 图像处理程序 - 工具栏窗口 (Toolbox)

GIMP - GNU 图像处理程序 - 工具栏窗口 [Toolbox] 1. GNU Image Manipulation Program2. Windows -> Recently Closed Docks -> ToolboxReferences 1. GNU Image Manipulation Program 2. Windows -> Recently Closed Docks -> Toolbox References [1] Yongqiang …

软件概要设计说明书word原件(实际项目)

一、 引言 &#xff08;一&#xff09; 编写目的 &#xff08;二&#xff09; 范围 &#xff08;三&#xff09; 文档约定 &#xff08;四&#xff09; 术语 二、 项目概要 &#xff08;一&#xff09; 建设背景 &#xff08;二&#xff09; 建设目标 &#xff08;三&a…

Typora字数过多的时候造成卡顿现象如何解决?

Typora字数过多的时候造成卡顿现象如何解决&#xff1f; 点击 、切换、滚动、打字都有点卡顿&#xff0c;下面介绍三种方法&#xff0c;三种方法都可以尝试&#xff0c;建议先尝试方法一&#xff0c;效果不满意就用方法二&#xff0c;实在不行就最后一个取巧的办法。 方法1&a…

图像处理与视觉感知---期末复习重点(5)

文章目录 一、膨胀与腐蚀1.1 膨胀1.2 腐蚀 二、开操作与闭操作 一、膨胀与腐蚀 1.1 膨胀 1. 集合 A A A 被集合 B B B 膨胀&#xff0c;定义式如下。其中集合 B B B 也称为结构元素&#xff1b; ( B ^ ) z (\hat{B})z (B^)z 表示 B B B 的反射平移 z z z 后得到的新集合。…

《Vision mamba》论文笔记

原文出处&#xff1a; [2401.09417] Vision Mamba: Efficient Visual Representation Learning with Bidirectional State Space Model (arxiv.org) 原文笔记&#xff1a; What&#xff1a; Vision Mamba: Efficient Visual Representation Learning with Bidirectional St…

llama-index 结合chatglm3-6B 利用RAG 基于文档智能问答

简介 llamaindex结合chatglm3使用 import os import torch from llama_index.core import VectorStoreIndex, ServiceContext from llama_index.core.callbacks import CallbackManager from llama_index.core.llms.callbacks import llm_completion_callback from llama_ind…

Groovy基础入门

一、Groovy简介 Groovy是运行在JVM中的一种动态语言&#xff0c;可以在Java平台上进行编程&#xff0c;使用方式基本与使用Java代码的方式相同&#xff0c;它的语法与Java语言的语法很相似&#xff0c;与Java相比&#xff0c;Groovy更加灵活、简洁&#xff0c;而且完成同样的功…

C语言例4-6:格式字符d的使用例子

代码如下&#xff1a; //格式字符d的使用例子 #include<stdio.h> int main(void) {int num1123;long num2123456;printf("num1%d,num1%5d,num1%-5d,num1%2d\n",num1,num1,num1,num1);//以四种不同格式&#xff0c;输出int型数据num1的值printf("num2%ld,…

Mybatis别名 动态sql语句 分页查询

给Mybatis的实体类起别名 给Mybatis的xml文件注册mapper映射文件 动态sql语句 1 if 2 choose 3 where 4 foreach 一&#xff09;if 查询指定名称商品信息 语法&#xff1a; SELECT * FROM goods where 11 <if test "gName!null"> and g.g_name like co…

linux:线程同步

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《Linux》 文章目录 前言线程同步条件变量接口简单示例pthread_cond_wait为什么要有mutex伪唤醒问题的解决 (if->while) 总结 前言 本文作为我对于线程同步知识总结 线程同步 同步&…

admin端

一、创建项目 1.1 技术栈 1.2 vite 项目初始化 npm init vitelatest vue3-element-admin --template vue-ts 1.3 src 路径别名配置 Vite 配置 配置 vite.config.ts // https://vitejs.dev/config/import { UserConfig, ConfigEnv, loadEnv, defineConfig } from vite im…

步态采集平台

&#x1f349;步骤一、读取视频每一帧图像 &#x1f349;步骤二、对读取的图像进行分割&#xff0c;得到全景下的步态轮廓图。 ​​​​​​​&#x1f349;步骤三、对读取的图像进行裁剪得到归一化的步态轮廓图。 ​​​​​​​&#x1f349;步骤四、保存这一帧步态轮廓图

【Web应用技术基础】CSS(5)——表格样式

第一题&#xff1a;表格边框 .html <!DOCTYPE html> <html><head><meta charset"UTF-8" /><title>HTML – 简单表格</title><link rel"stylesheet" href"step1/CSS/style.css"></head><bod…