Skip to content

SmartFlowAI/TheGodOfCookery

Repository files navigation



中文 | English

license issue resolution open issues

🔍 探索我们的模型:

Open in OpenXLabOpen in OpenXLab

Static BadgeStatic BadgeStatic Badge

《食神》项目获上海人工智能实验室主办的2024浦源大模型系列挑战赛春季赛创新创意奖!!!

📍目录

📖项目简介

​ 本项目名称为“食神”( The God Of Cookery ),灵感来自喜剧大师周星驰主演的著名电影《食神》,旨在通过人工智能技术为用户提供烹饪咨询和食谱推荐,帮助用户更好地学习和实践烹饪技巧,降低烹饪门槛,实现《食神》电影中所讲的“只要用心,人人皆能做食神”。

​ 本APP的基本思想,是基于InternLM的对话模型,采用 XiaChuFang Recipe Corpus 提供的1,520,327种中国食谱进行微调,生成食谱模型。 模型存放在ModelScope上,应用部署在OpenXlab上。为此感谢魔搭社区提供免费的模型存放空间,感谢OpenXLab提供应用部署环境及GPU资源。

​ 本APP提供的回答仅供参考,不作为正式菜谱的真实制作步骤。由于大模型的“幻觉”特性,很可能有些食谱会给用户带来心理或生理上的不利影响,切勿上纲上线。

🗺️技术架构

1. 整体技术架构

​ 项目主要依赖上海人工智能实验室开源模型internlm-chat-7b(包含1代和2代),在XiaChuFang Recipe Corpus 提供的1,520,327种中国食谱数据集上借助Xtuner进行LoRA微调,形成shishen2_full模型,并将微调后模型与向量数据库整合入langchain,实现RAG检索增强的效果,并可进行多模态(语音、文字、图片)问答对话,前端基于streamlit实现与用户的交互。

2. 应用整体流程

​ 用户发出请求后,应用加载模型(语音模型,文生图模型,微调后的对话模型),并处理用户的文字输入或者语音输入,如果未打开RAG开关,则直接调用微调后的对话模型生成回复,对结果进行格式化输出,并调用stable diffusion模型生成图片,最后将相应结果返回用户;如果打开RAG开关,则利用langchain检索向量数据库,并将检索结果输入微调后的对话模型生成回复,对结果进行格式化输出,并调用stable diffusion模型生成图片,最后将相应结果返回用户。

✨技术报告

1.技术报告

2.讲解视频

章节名称 文档写作负责人 技术负责人
总体概述 轩辕, 九月, 张辉 张辉
语音识别 轩辕 sole fish
文生图 房宇亮 房宇亮
RAG 轩辕 Charles,乐正萌
模型微调 轩辕 张辉,轩辕
Web UI 房宇亮 房宇亮

📆更新说明

  • 敬请期待...

  • 基于llama-index和HyQE的RAG系统

  • 语音输出

  • 其他大模型支持

  • [2024.4.21] 基于团队成员 @乐正萌 的HyQE(基于LangChain)合并到main分支

  • [2024.3.20] 修改readme

  • [2024.3.19] 整合文档到docs目录

  • [2024.3.9] 基于团队成员 @乐正萌 的RAG模块(faiss),整合 text2image分支,发布二阶段第4个基于openxlab A100的应用 点我体验 和 openxlab A10的应用 点我体验

  • [2024.3.4] 增加英文readme

  • [2024.3.3] 基于团队成员 @sole fish 的 paraformer语音输入模块,整合 text2image分支,发布二阶段第3个基于openxlab A100的应用 点我体验(此链接已弃用)

  • [2024.2.24] 基于团队成员 @Charles 的RAG模块(Chroma),整合 text2image分支,发布二阶段第2个基于openxlab A100的应用 点我体验(此链接已弃用)

  • [2024.2.22] 基于团队成员 @房宇亮 的文生图模块 以及 @sole fish 的 whisper语音输入模块,整合 text2image分支,发布二阶段(模型基座InternLM2-Chat-7B)第1个基于openxlab A100的应用 点我体验(此链接已弃用)

  • [2024.1.30] 基于团队成员 @张辉 二代150万菜谱微调的模型和APP发布。(使用InternStudio+A100 1/4X2 40G显存微调,1.25 15:46-1.30 12:25,微调历时4天20小时39分钟)

  • [2024.1.28] 基于团队成员 @张辉一代150万菜谱(使用了其中一部分数据)微调的模型(模型基座为InternLM-Chat-7B)和APP发布。(使用WSL+Ubuntu22.04+RTX4090 24G显存微调,1.26 18:40-1.28 13:46历时1天19小时6分钟)。

🛠️使用指南

1. 数据集准备

150万下厨房微调数据集:提取密码8489

2. 安装

  • 准备 Python 虚拟环境:
conda create -n cook python=3.10 -y
conda activate cook
  • 克隆该仓库:
git clone https://github.com/SmartFlowAI/TheGodOfCookery.git
cd ./TheGodOfCookery
  • 安装Pytorch和依赖库:
conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia
pip install -r requirements.txt
  • 解决portaudio编译错误 在安装requirements.txt时,可能遇到如下错误
Building wheels for collected packages: pyaudio
  Building wheel for pyaudio (pyproject.toml) ... error
  error: subprocess-exited-with-error
  
  × Building wheel for pyaudio (pyproject.toml) did not run successfully.
  │ exit code: 1
  ╰─> [18 lines of output]
      running bdist_wheel
      running build
      running build_py
      creating build
      creating build/lib.linux-x86_64-cpython-310
      creating build/lib.linux-x86_64-cpython-310/pyaudio
      copying src/pyaudio/__init__.py -> build/lib.linux-x86_64-cpython-310/pyaudio
      running build_ext
      building 'pyaudio._portaudio' extension
      creating build/temp.linux-x86_64-cpython-310
      creating build/temp.linux-x86_64-cpython-310/src
      creating build/temp.linux-x86_64-cpython-310/src/pyaudio
      gcc -pthread -B /root/.conda/envs/cook/compiler_compat -Wno-unused-result -Wsign-compare -DNDEBUG -fwrapv -O2 -Wall -fPIC -O2 -isystem /root/.conda/envs/cook/include -fPIC -O2 -isystem /root/.conda/envs/cook/include -fPIC -I/usr/local/include -I/usr/include -I/root/.conda/envs/cook/include/python3.10 -c src/pyaudio/device_api.c -o build/temp.linux-x86_64-cpython-310/src/pyaudio/device_api.o
      src/pyaudio/device_api.c:9:10: fatal error: portaudio.h: No such file or directory
          9 | #include "portaudio.h"
            |          ^~~~~~~~~~~~~
      compilation terminated.
      error: command '/usr/bin/gcc' failed with exit code 1
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
  ERROR: Failed building wheel for pyaudio
Failed to build pyaudio
ERROR: Could not build wheels for pyaudio, which is required to install pyproject.toml-based projects

这是因为系统里缺少portaudio相关开发包,需要先安装它。

sudo apt update
sudo apt install -y portaudio19-dev

这里cuda的版本根据用户自己的cuda版本确定。一般为 11.8或12.1

3. 训练

  • 一阶段一代7b模型 使用 xtuner 0.1.9 训练,在 internlm-chat-7b 上进行微调
  • 一阶段二代7b模型 使用 xtuner 0.1.13 训练,在 internlm2-chat-7b 上进行微调
  • 二阶段二代1.8b模型 使用 xtuner 0.1.15.dev0 训练,在 internlm2-chat-1.8b 上进行微调

(1)微调方法如下:

xtuner train ${YOUR_CONFIG} --deepspeed deepspeed_zero2

--deepspeed` 表示使用 DeepSpeed 来优化训练过程。XTuner 内置了多种策略,包括 ZeRO-1、ZeRO-2、ZeRO-3 等。如果用户期望关闭此功能,请直接移除此参数。

(2)将保存的 .pth 模型(如果使用的DeepSpeed,则将会是一个文件夹)转换为 LoRA 模型:

export MKL_SERVICE_FORCE_INTEL=1
xtuner convert pth_to_hf ${YOUR_CONFIG} ${PTH} ${LoRA_PATH}

(3)将LoRA模型合并入 HuggingFace 模型:

xtuner convert merge ${Base_PATH} ${LoRA_PATH} ${SAVE_PATH}

4. 对话

xtuner chat ${SAVE_PATH} [optional arguments]

参数:

  • --prompt-template: 一代模型使用 internlm_chat,二代使用 internlm2_chat。
  • --system: 指定对话的系统字段。
  • --bits {4,8,None}: 指定 LLM 的比特数。默认为 fp16。
  • --no-streamer: 是否移除 streamer。
  • --top: 对于二代模型,建议为0.8。
  • --temperature: 对于二代模型,建议为0.8。
  • --repetition-penalty: 对于二代7b模型,建议为1.002,对于二代1.8b模型,建议为1.17,对于一代模型可不填。
  • 更多信息,请执行 xtuner chat -h 查看。

5. 演示

二阶段对话效果(文本+图片对话):

Demo 访问地址:A100 A10

1710422208862

1710422224731

一阶段对话效果(纯文本对话):

Demo 样例

answer001

answer002

6. 模型地址

modelscope一代7b模型
modelscope二代7b模型
modelscope二代1.8b模型
openxlab一代7b模型
openxlab二代7b模型

import torch
from modelscope import AutoTokenizer, AutoModelForCausalLM
from tools.transformers.interface import GenerationConfig, generate_interactive

model_name_or_path = "zhanghuiATchina/zhangxiaobai_shishen_full" #modelscope相对路径,如二代微调模型为 zhanghuiATchina/zhangxiaobai_shishen2_full

tokenizer = AutoTokenizer.from_pretrained(model_name_or_path, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(model_name_or_path, trust_remote_code=True, torch_dtype=torch.bfloat16, device_map='auto')
model = model.eval()

messages = []
generation_config = GenerationConfig(max_length=max_length, top_p=0.8, temperature=0.8, repetition_penalty=1.002)

response, history = model.chat(tokenizer, "你好", history=[])
print(response)
response, history = model.chat(tokenizer, "酸菜鱼怎么做", history=history)
print(response)

7. 实践文档

一阶段一代实践
一阶段二代实践

8. 演示视频

一阶段实践视频

参赛视频

📋项目代码结构

二阶段

项目目录
|---assets  # 图片目录,生成的图片临时也放在这里,今后会考虑迁移到其他目录
|     |---robot.png                                        #对话机器人图标 
|     |---user.png                                         #对话用户图标 
|     |---shishen.png                                      #项目图标 (主要贡献者 @刘光磊)
|
|---config   # 配置文件目录(主要贡献者 @房宇亮)
|     |---__init__.py                                      #初始化脚本
|     |---config.py                                        #配置脚本
|
|---docs   # 文档目录
|     |---tech_report.md                                   #技术报告
|     |---Introduce_x.x.pdf                                #项目介绍PPT
|
|---eval   # RAG模块评测目录
|
|---food_icon   # 食材图标目录
|     |---*.png                                            #各类食材图标
|
|---gen_image    # 文生图目录(主要贡献者 @房宇亮)
|     |---__init__.py                                      #初始化脚本
|     |---sd_gen_image.py                                  #使用Stabble Disffion的文生图模块
|     |---zhipu_ai_image.py                                #使用智谱AI的文生图模块
|
|---images   # 暂存文生图模型生成的图片的目录
|
|---rag_langchain   # 二代RAG代码目录(主要贡献者 @乐正萌)
|     |---chroma_db                                        #chroma数据库目录
|     |     |- chroma.sqlite3                              #chroma数据库文件
|     |---data                                             #菜谱数据集目录
|     |     |- tran_dataset_1000.json                      #只有1000条数据的测试菜谱数据集
|     |---faiss_index                                      #FAISS数据库目录
|     |     |- index.faiss   
|     |     |- index.pkl
|     |---retrieve                                         #retrieve目录
|     |     |- bm25retriever.pkl                           #序列化保存的BM25retrieve
|     |---CookMasterLLM.py                                 #langchain封装的大模型
|     |---create_db_json.py                                #从json数据集文件创建向量数据库
|     |---HyQEContextualCompressionRetriever.py            #HyQE检索器
|     |---interface.py                                     #RAG模块接口
|     |---README.md                                        #RAG模块说明
|
|---speech   # paraformer语音识别目录(主要贡献者 @solo fish)
|     |---__init__.py                                      #初始化脚本
|     |---utils.py                                         #语音识别处理脚本
|
|---app.py                                                 #Web Demo主脚本
|---cli_demo.py                                            #模型测试脚本
|---convert_t2s.py                                         #繁体字转简体字工具(主要贡献者 @彬彬)
|---download.py                                            #模型下载脚本
|---parse_cur_response.py                                  #输出格式化处理工具 (主要贡献者 @彬彬)
|---start.py                                               #streamlit启动脚本
|---web_demo.py                                            #Web Demo启动脚本
|---requirements.txt                                       #系统依赖包(请使用pip install -r requirements.txt安装)
|---README.md                                              #本文档

☕项目成员(排名不分先后)

用户名 组织 贡献 备注
张小白 南京大学本科毕业,现为某公司数据工程师 项目策划、测试和打杂 华为云HCDE(原华为云MVP),2020年华为云社区十佳博主,2022年昇腾社区优秀开发者,2022年华为云社区年度优秀版主,MindSpore布道师,DataWhale优秀学习者
sole fish 中国科学院大学在读博士研究生 语音输入模块
Charles 同济大学本科毕业生,考研中 一代RAG模块(基于Chroma); RAG测试
乐正萌 上海海洋大学本科毕业生,考研中 二代RAG模块(基于faiss&Chroma);提出HyQE;RAG迁移至llama-index框架
彬彬 华东师范大学本科毕业、现为某公司算法开发工程师 格式化输出
房宇亮 南京大学本科毕业,现为某公司算法工程师 文生图模块、配置工具
刘光磊 - 图标设计
轩辕 南京大学在读硕士 项目文档、视频整合
程宏 minisora主要维护者 技术资源整合 & 未来发展建议
usamimeri 厦门大学在读本科生 llama-index框架技术初探

💖特别鸣谢

感谢上海人工智能实验室组织的 书生·浦语实战营 学习活动~~~

感谢 OpenXLab 对项目部署的算力支持~~~

感谢 浦语小助手 对项目的支持~~~

加入我们

欢迎大模型爱好者入群参加讨论:

开源协议

本项目采用 Apache License 2.0 开源许可证

Star History

Star History Chart

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages