From 94aa182c5273670f0d223b794fee7eff37a6acbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E6=B5=B7=E4=BA=AE?= Date: Thu, 26 Dec 2024 17:13:52 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E6=96=B0=E5=A2=9ECPU=E6=8E=A8=E7=90=86?= =?UTF-8?q?=E6=A8=A1=E5=9E=8B=E9=83=A8=E7=BD=B2=E6=8C=87=E5=8D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...50\347\275\262\346\214\207\345\215\227.md" | 83 ++++++++++++++++++ ...3\350\276\221\346\240\270\345\277\203.png" | Bin 0 -> 6950 bytes 2 files changed, 83 insertions(+) create mode 100644 "docs/user-guide/CPU\351\203\250\347\275\262\346\214\207\345\215\227/CPU\346\216\250\347\220\206\346\250\241\345\236\213\351\203\250\347\275\262\346\214\207\345\215\227.md" create mode 100644 "docs/user-guide/CPU\351\203\250\347\275\262\346\214\207\345\215\227/picture/CPU\351\200\273\350\276\221\346\240\270\345\277\203.png" diff --git "a/docs/user-guide/CPU\351\203\250\347\275\262\346\214\207\345\215\227/CPU\346\216\250\347\220\206\346\250\241\345\236\213\351\203\250\347\275\262\346\214\207\345\215\227.md" "b/docs/user-guide/CPU\351\203\250\347\275\262\346\214\207\345\215\227/CPU\346\216\250\347\220\206\346\250\241\345\236\213\351\203\250\347\275\262\346\214\207\345\215\227.md" new file mode 100644 index 000000000..2a0fae41c --- /dev/null +++ "b/docs/user-guide/CPU\351\203\250\347\275\262\346\214\207\345\215\227/CPU\346\216\250\347\220\206\346\250\241\345\236\213\351\203\250\347\275\262\346\214\207\345\215\227.md" @@ -0,0 +1,83 @@ +# CPU推理模型部署指南 + +## 介绍 + +sysInfer是一款基于鲲鹏+openEuler的大模型推理加速框架,主要采用通用算力CPU作为部署主体,目前支持使用Baichuan系列和Llama3系列的权重进行加速推理,支持使用gguf的量化格式模型。作为CPU的推理框架,突破了传统GPU部署大模型推理的限制,采用点到点的推理部署策略,充分挖掘通用算力的潜能,显著提升了CPU在大模型推理场景中的效率和价值。同时,该框架深化了鲲鹏处理器的特性支持,并与openEuler生态深度融合,助力拓展了鲲鹏和openEuler在大模型领域的生态应用广度。 + +## 环境准备 + +### 硬件要求 + +| 类型 | 硬件要求 | +|----------------| -----------------------------| +| 服务器 | 1台 | +| CPU | 鲲鹏>= 64 cores | +| 内存 | >= 256 GB | +| 内存带宽 | >= 100 GB/s | + +### 权重模型 + +支持huggingface上的Baichuan2-13B和Llama3-8B等开源权重模型 + +```shell +mkdir -r /home/app +cd /home/app +# 以Baichuan2-13B-Chat-GGUF为例 +wget https://hf-mirror.com/second-state/Baichuan2-13B-Chat-GGUF/resolve/main/Baichuan2-13B-Chat-Q4_0.gguf +# Llama3 +wget https://hf-mirror.com/shenzhi-wang/Llama3-8B-Chinese-Chat-GGUF-4bit/resolve/main/Llama3-8B-Chinese-Chat-q4_0-v2_1.gguf +``` + +### docker镜像拉取 + +```shell +# oe_openai_server:0.0.1镜像 +docker pull hub.oepkgs.net/neocopilot/oe_openai_server@sha256:2c87870fc34754391b1160bc0478f2691d0d47e47bb5a5bc18d8ec352d73fcb3 +``` + + + +## 部署openai服务接口 + +### 接口部署 + +```shell +# 查看鲲鹏920系列服务器逻辑核分布情况,下面以鲲鹏920为例 +lscpu +``` +CPU逻辑核心分布图 + +```shell +# 以鲲鹏920为例进行绑核,逻辑核总数设置4的倍数,绑核按numa节点平均分配 +docker run -it \ + -v /home/app/Baichuan2-13B-Chat-Q4_0.gguf:/app/Baichuan2-13B-Chat-Q4_0.gguf \ + -p 7860:7860 \ + -e OMP_NUM_THREADS=88 \ + -e GOMP_CPU_AFFINITY=0-21,24-45,48-69,72-93 \ + hub.oepkgs.net/neocopilot/oe_openai_server:0.0.1 \ + ./server /app/Baichuan2-13B-Chat-Q4_0.gguf -t 0.0 -n 4096 +``` + +### 接口功能测试 + +按照openai官方文档构建的python脚本,用于验证功能,验证无误后可接入EulerCopilot。 + +```python +# request.py +from openai import OpenAI +client = OpenAI(base_url="http://127.0.0.1:7860/v1") + +completion = client.chat.completions.create( + model="Baichuan2-13B-Chat-Q4_0", + messages=[ + {"role": "system", "content": "你是智能问答机器人。"}, + {"role": "user", "content": "请你告诉我openEuler操作系统的发布规律。"} + ], + stream=True +) + +for chunk in completion: + print(chunk.choices[0].delta) + +``` + diff --git "a/docs/user-guide/CPU\351\203\250\347\275\262\346\214\207\345\215\227/picture/CPU\351\200\273\350\276\221\346\240\270\345\277\203.png" "b/docs/user-guide/CPU\351\203\250\347\275\262\346\214\207\345\215\227/picture/CPU\351\200\273\350\276\221\346\240\270\345\277\203.png" new file mode 100644 index 0000000000000000000000000000000000000000..74ae942b5a5217b8a5e34a2b2cd8d32a49be7a00 GIT binary patch literal 6950 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 DIFzr! literal 0 HcmV?d00001 -- Gitee From 45cba05626f5df9a0485300d8dcd816c6a57eaba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E6=B5=B7=E4=BA=AE?= Date: Thu, 26 Dec 2024 17:13:52 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E6=96=B0=E5=A2=9ECPU=E6=8E=A8=E7=90=86?= =?UTF-8?q?=E6=A8=A1=E5=9E=8B=E9=83=A8=E7=BD=B2=E6=8C=87=E5=8D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...50\347\275\262\346\214\207\345\215\227.md" | 83 ++++++++++++++++++ ...3\350\276\221\346\240\270\345\277\203.png" | Bin 0 -> 6950 bytes 2 files changed, 83 insertions(+) create mode 100644 "docs/user-guide/\351\203\250\347\275\262\346\214\207\345\215\227/CPU\346\216\250\347\220\206\346\250\241\345\236\213\351\203\250\347\275\262\346\214\207\345\215\227.md" create mode 100644 "docs/user-guide/\351\203\250\347\275\262\346\214\207\345\215\227/pictures/CPU\346\216\250\347\220\206\351\203\250\347\275\262/CPU\351\200\273\350\276\221\346\240\270\345\277\203.png" diff --git "a/docs/user-guide/\351\203\250\347\275\262\346\214\207\345\215\227/CPU\346\216\250\347\220\206\346\250\241\345\236\213\351\203\250\347\275\262\346\214\207\345\215\227.md" "b/docs/user-guide/\351\203\250\347\275\262\346\214\207\345\215\227/CPU\346\216\250\347\220\206\346\250\241\345\236\213\351\203\250\347\275\262\346\214\207\345\215\227.md" new file mode 100644 index 000000000..2a2b89cf0 --- /dev/null +++ "b/docs/user-guide/\351\203\250\347\275\262\346\214\207\345\215\227/CPU\346\216\250\347\220\206\346\250\241\345\236\213\351\203\250\347\275\262\346\214\207\345\215\227.md" @@ -0,0 +1,83 @@ +# CPU推理模型部署指南 + +## 介绍 + +sysInfer是一款基于鲲鹏+openEuler的大模型推理加速框架,主要采用通用算力CPU作为部署主体,目前支持使用Baichuan系列和Llama3系列的权重进行加速推理,支持使用gguf的量化格式模型。作为CPU的推理框架,突破了传统GPU部署大模型推理的限制,采用点到点的推理部署策略,充分挖掘通用算力的潜能,显著提升了CPU在大模型推理场景中的效率和价值。同时,该框架深化了鲲鹏处理器的特性支持,并与openEuler生态深度融合,助力拓展了鲲鹏和openEuler在大模型领域的生态应用广度。 + +## 环境准备 + +### 硬件要求 + +| 类型 | 硬件要求 | +|----------------| -----------------------------| +| 服务器 | 1台 | +| CPU | 鲲鹏>= 64 cores | +| 内存 | >= 256 GB | +| 内存带宽 | >= 100 GB/s | + +### 权重模型 + +支持huggingface上的Baichuan2-13B和Llama3-8B等开源权重模型 + +```shell +mkdir -r /home/app +cd /home/app +# 以Baichuan2-13B-Chat-GGUF为例 +wget https://hf-mirror.com/second-state/Baichuan2-13B-Chat-GGUF/resolve/main/Baichuan2-13B-Chat-Q4_0.gguf +# Llama3 +wget https://hf-mirror.com/shenzhi-wang/Llama3-8B-Chinese-Chat-GGUF-4bit/resolve/main/Llama3-8B-Chinese-Chat-q4_0-v2_1.gguf +``` + +### docker镜像拉取 + +```shell +# oe_openai_server:0.0.1镜像 +docker pull hub.oepkgs.net/neocopilot/oe_openai_server@sha256:2c87870fc34754391b1160bc0478f2691d0d47e47bb5a5bc18d8ec352d73fcb3 +``` + + + +## 部署openai服务接口 + +### 接口部署 + +```shell +# 查看鲲鹏920系列服务器逻辑核分布情况,下面以鲲鹏920为例 +lscpu +``` +CPU逻辑核心分布图 + +```shell +# 以鲲鹏920为例进行绑核,逻辑核总数设置4的倍数,绑核按numa节点平均分配 +docker run -it \ + -v /home/app/Baichuan2-13B-Chat-Q4_0.gguf:/app/Baichuan2-13B-Chat-Q4_0.gguf \ + -p 7860:7860 \ + -e OMP_NUM_THREADS=88 \ + -e GOMP_CPU_AFFINITY=0-21,24-45,48-69,72-93 \ + hub.oepkgs.net/neocopilot/oe_openai_server:0.0.1 \ + ./server /app/Baichuan2-13B-Chat-Q4_0.gguf -t 0.0 -n 4096 +``` + +### 接口功能测试 + +按照openai官方文档构建的python脚本,用于验证功能,验证无误后可接入EulerCopilot。 + +```python +# request.py +from openai import OpenAI +client = OpenAI(base_url="http://127.0.0.1:7860/v1") + +completion = client.chat.completions.create( + model="Baichuan2-13B-Chat-Q4_0", + messages=[ + {"role": "system", "content": "你是智能问答机器人。"}, + {"role": "user", "content": "请你告诉我openEuler操作系统的发布规律。"} + ], + stream=True +) + +for chunk in completion: + print(chunk.choices[0].delta) + +``` + diff --git "a/docs/user-guide/\351\203\250\347\275\262\346\214\207\345\215\227/pictures/CPU\346\216\250\347\220\206\351\203\250\347\275\262/CPU\351\200\273\350\276\221\346\240\270\345\277\203.png" "b/docs/user-guide/\351\203\250\347\275\262\346\214\207\345\215\227/pictures/CPU\346\216\250\347\220\206\351\203\250\347\275\262/CPU\351\200\273\350\276\221\346\240\270\345\277\203.png" new file mode 100644 index 0000000000000000000000000000000000000000..74ae942b5a5217b8a5e34a2b2cd8d32a49be7a00 GIT binary patch literal 6950 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 DIFzr! literal 0 HcmV?d00001 -- Gitee From 21b9030aebcc41bb1dbcfadb6540c1926c372e7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E6=B5=B7=E4=BA=AE?= Date: Thu, 26 Dec 2024 19:16:29 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E6=96=B0=E5=A2=9ECPU=E6=8E=A8=E7=90=86?= =?UTF-8?q?=E6=A8=A1=E5=9E=8B=E9=83=A8=E7=BD=B2=E6=8C=87=E5=8D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...50\347\275\262\346\214\207\345\215\227.md" | 83 ++++++++++++++++++ ...3\350\276\221\346\240\270\345\277\203.png" | Bin 0 -> 6950 bytes 2 files changed, 83 insertions(+) create mode 100644 "docs/user-guide/\351\203\250\347\275\262\346\214\207\345\215\227/CPU\346\216\250\347\220\206\346\250\241\345\236\213\351\203\250\347\275\262\346\214\207\345\215\227.md" create mode 100644 "docs/user-guide/\351\203\250\347\275\262\346\214\207\345\215\227/pictures/CPU\346\216\250\347\220\206\351\203\250\347\275\262/CPU\351\200\273\350\276\221\346\240\270\345\277\203.png" diff --git "a/docs/user-guide/\351\203\250\347\275\262\346\214\207\345\215\227/CPU\346\216\250\347\220\206\346\250\241\345\236\213\351\203\250\347\275\262\346\214\207\345\215\227.md" "b/docs/user-guide/\351\203\250\347\275\262\346\214\207\345\215\227/CPU\346\216\250\347\220\206\346\250\241\345\236\213\351\203\250\347\275\262\346\214\207\345\215\227.md" new file mode 100644 index 000000000..2a2b89cf0 --- /dev/null +++ "b/docs/user-guide/\351\203\250\347\275\262\346\214\207\345\215\227/CPU\346\216\250\347\220\206\346\250\241\345\236\213\351\203\250\347\275\262\346\214\207\345\215\227.md" @@ -0,0 +1,83 @@ +# CPU推理模型部署指南 + +## 介绍 + +sysInfer是一款基于鲲鹏+openEuler的大模型推理加速框架,主要采用通用算力CPU作为部署主体,目前支持使用Baichuan系列和Llama3系列的权重进行加速推理,支持使用gguf的量化格式模型。作为CPU的推理框架,突破了传统GPU部署大模型推理的限制,采用点到点的推理部署策略,充分挖掘通用算力的潜能,显著提升了CPU在大模型推理场景中的效率和价值。同时,该框架深化了鲲鹏处理器的特性支持,并与openEuler生态深度融合,助力拓展了鲲鹏和openEuler在大模型领域的生态应用广度。 + +## 环境准备 + +### 硬件要求 + +| 类型 | 硬件要求 | +|----------------| -----------------------------| +| 服务器 | 1台 | +| CPU | 鲲鹏>= 64 cores | +| 内存 | >= 256 GB | +| 内存带宽 | >= 100 GB/s | + +### 权重模型 + +支持huggingface上的Baichuan2-13B和Llama3-8B等开源权重模型 + +```shell +mkdir -r /home/app +cd /home/app +# 以Baichuan2-13B-Chat-GGUF为例 +wget https://hf-mirror.com/second-state/Baichuan2-13B-Chat-GGUF/resolve/main/Baichuan2-13B-Chat-Q4_0.gguf +# Llama3 +wget https://hf-mirror.com/shenzhi-wang/Llama3-8B-Chinese-Chat-GGUF-4bit/resolve/main/Llama3-8B-Chinese-Chat-q4_0-v2_1.gguf +``` + +### docker镜像拉取 + +```shell +# oe_openai_server:0.0.1镜像 +docker pull hub.oepkgs.net/neocopilot/oe_openai_server@sha256:2c87870fc34754391b1160bc0478f2691d0d47e47bb5a5bc18d8ec352d73fcb3 +``` + + + +## 部署openai服务接口 + +### 接口部署 + +```shell +# 查看鲲鹏920系列服务器逻辑核分布情况,下面以鲲鹏920为例 +lscpu +``` +CPU逻辑核心分布图 + +```shell +# 以鲲鹏920为例进行绑核,逻辑核总数设置4的倍数,绑核按numa节点平均分配 +docker run -it \ + -v /home/app/Baichuan2-13B-Chat-Q4_0.gguf:/app/Baichuan2-13B-Chat-Q4_0.gguf \ + -p 7860:7860 \ + -e OMP_NUM_THREADS=88 \ + -e GOMP_CPU_AFFINITY=0-21,24-45,48-69,72-93 \ + hub.oepkgs.net/neocopilot/oe_openai_server:0.0.1 \ + ./server /app/Baichuan2-13B-Chat-Q4_0.gguf -t 0.0 -n 4096 +``` + +### 接口功能测试 + +按照openai官方文档构建的python脚本,用于验证功能,验证无误后可接入EulerCopilot。 + +```python +# request.py +from openai import OpenAI +client = OpenAI(base_url="http://127.0.0.1:7860/v1") + +completion = client.chat.completions.create( + model="Baichuan2-13B-Chat-Q4_0", + messages=[ + {"role": "system", "content": "你是智能问答机器人。"}, + {"role": "user", "content": "请你告诉我openEuler操作系统的发布规律。"} + ], + stream=True +) + +for chunk in completion: + print(chunk.choices[0].delta) + +``` + diff --git "a/docs/user-guide/\351\203\250\347\275\262\346\214\207\345\215\227/pictures/CPU\346\216\250\347\220\206\351\203\250\347\275\262/CPU\351\200\273\350\276\221\346\240\270\345\277\203.png" "b/docs/user-guide/\351\203\250\347\275\262\346\214\207\345\215\227/pictures/CPU\346\216\250\347\220\206\351\203\250\347\275\262/CPU\351\200\273\350\276\221\346\240\270\345\277\203.png" new file mode 100644 index 0000000000000000000000000000000000000000..74ae942b5a5217b8a5e34a2b2cd8d32a49be7a00 GIT binary patch literal 6950 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 DIFzr! literal 0 HcmV?d00001 -- Gitee From 0d59cb58c85314ec6ee78d63081a0ba35b2f5b2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E6=B5=B7=E4=BA=AE?= Date: Thu, 26 Dec 2024 11:18:36 +0000 Subject: [PATCH 4/4] Revert "Merge branch 'master' of https://gitee.com/qmzznbxhl/euler-copilot-framework_1" This reverts commit 2fa8098efe9a4283fb819fd4f449568e49daa257. --- ...50\347\275\262\346\214\207\345\215\227.md" | 83 ------------------ ...3\350\276\221\346\240\270\345\277\203.png" | Bin 6950 -> 0 bytes 2 files changed, 83 deletions(-) delete mode 100644 "docs/user-guide/CPU\351\203\250\347\275\262\346\214\207\345\215\227/CPU\346\216\250\347\220\206\346\250\241\345\236\213\351\203\250\347\275\262\346\214\207\345\215\227.md" delete mode 100644 "docs/user-guide/CPU\351\203\250\347\275\262\346\214\207\345\215\227/picture/CPU\351\200\273\350\276\221\346\240\270\345\277\203.png" diff --git "a/docs/user-guide/CPU\351\203\250\347\275\262\346\214\207\345\215\227/CPU\346\216\250\347\220\206\346\250\241\345\236\213\351\203\250\347\275\262\346\214\207\345\215\227.md" "b/docs/user-guide/CPU\351\203\250\347\275\262\346\214\207\345\215\227/CPU\346\216\250\347\220\206\346\250\241\345\236\213\351\203\250\347\275\262\346\214\207\345\215\227.md" deleted file mode 100644 index 2a0fae41c..000000000 --- "a/docs/user-guide/CPU\351\203\250\347\275\262\346\214\207\345\215\227/CPU\346\216\250\347\220\206\346\250\241\345\236\213\351\203\250\347\275\262\346\214\207\345\215\227.md" +++ /dev/null @@ -1,83 +0,0 @@ -# CPU推理模型部署指南 - -## 介绍 - -sysInfer是一款基于鲲鹏+openEuler的大模型推理加速框架,主要采用通用算力CPU作为部署主体,目前支持使用Baichuan系列和Llama3系列的权重进行加速推理,支持使用gguf的量化格式模型。作为CPU的推理框架,突破了传统GPU部署大模型推理的限制,采用点到点的推理部署策略,充分挖掘通用算力的潜能,显著提升了CPU在大模型推理场景中的效率和价值。同时,该框架深化了鲲鹏处理器的特性支持,并与openEuler生态深度融合,助力拓展了鲲鹏和openEuler在大模型领域的生态应用广度。 - -## 环境准备 - -### 硬件要求 - -| 类型 | 硬件要求 | -|----------------| -----------------------------| -| 服务器 | 1台 | -| CPU | 鲲鹏>= 64 cores | -| 内存 | >= 256 GB | -| 内存带宽 | >= 100 GB/s | - -### 权重模型 - -支持huggingface上的Baichuan2-13B和Llama3-8B等开源权重模型 - -```shell -mkdir -r /home/app -cd /home/app -# 以Baichuan2-13B-Chat-GGUF为例 -wget https://hf-mirror.com/second-state/Baichuan2-13B-Chat-GGUF/resolve/main/Baichuan2-13B-Chat-Q4_0.gguf -# Llama3 -wget https://hf-mirror.com/shenzhi-wang/Llama3-8B-Chinese-Chat-GGUF-4bit/resolve/main/Llama3-8B-Chinese-Chat-q4_0-v2_1.gguf -``` - -### docker镜像拉取 - -```shell -# oe_openai_server:0.0.1镜像 -docker pull hub.oepkgs.net/neocopilot/oe_openai_server@sha256:2c87870fc34754391b1160bc0478f2691d0d47e47bb5a5bc18d8ec352d73fcb3 -``` - - - -## 部署openai服务接口 - -### 接口部署 - -```shell -# 查看鲲鹏920系列服务器逻辑核分布情况,下面以鲲鹏920为例 -lscpu -``` -CPU逻辑核心分布图 - -```shell -# 以鲲鹏920为例进行绑核,逻辑核总数设置4的倍数,绑核按numa节点平均分配 -docker run -it \ - -v /home/app/Baichuan2-13B-Chat-Q4_0.gguf:/app/Baichuan2-13B-Chat-Q4_0.gguf \ - -p 7860:7860 \ - -e OMP_NUM_THREADS=88 \ - -e GOMP_CPU_AFFINITY=0-21,24-45,48-69,72-93 \ - hub.oepkgs.net/neocopilot/oe_openai_server:0.0.1 \ - ./server /app/Baichuan2-13B-Chat-Q4_0.gguf -t 0.0 -n 4096 -``` - -### 接口功能测试 - -按照openai官方文档构建的python脚本,用于验证功能,验证无误后可接入EulerCopilot。 - -```python -# request.py -from openai import OpenAI -client = OpenAI(base_url="http://127.0.0.1:7860/v1") - -completion = client.chat.completions.create( - model="Baichuan2-13B-Chat-Q4_0", - messages=[ - {"role": "system", "content": "你是智能问答机器人。"}, - {"role": "user", "content": "请你告诉我openEuler操作系统的发布规律。"} - ], - stream=True -) - -for chunk in completion: - print(chunk.choices[0].delta) - -``` - diff --git "a/docs/user-guide/CPU\351\203\250\347\275\262\346\214\207\345\215\227/picture/CPU\351\200\273\350\276\221\346\240\270\345\277\203.png" "b/docs/user-guide/CPU\351\203\250\347\275\262\346\214\207\345\215\227/picture/CPU\351\200\273\350\276\221\346\240\270\345\277\203.png" deleted file mode 100644 index 74ae942b5a5217b8a5e34a2b2cd8d32a49be7a00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6950 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 DIFzr! -- Gitee