FastChat开放,媲美ChatGPT的90%能力——从下载到安装、部署

news2025/6/21 7:04:12

FastChat开放,媲美ChatGPT的90%能力——从下载到安装、部署

    • 前言
    • 两个前置软件
    • 创建FastChat虚拟环境
    • 安装PyTorch
    • 安装 FastChat
    • 下载 LLaMA,并转换
    • 生成FastChat对应的模型Vicuna
    • 启动FastChat的命令行交互
    • 将模型部署为一个服务,提供Web GUI

前言

  • 最近ChatGPT非常火,引爆了整个商业市场以及NLP学术界,但是ChatGPT很多东西都不开放,你也没法个人部署、研究
  • 于是很多大语言模型横空出世,在开放的大语言模型中,最近我认为效果很不错的是FastChat,基于LLaMA做了二次调参训练,据官方称能达到ChatGPT的90%的能力。(具体能否达到这个值,可以直接去他们的Demo上试试)
  • 相关链接
    • GitHub地址: https://github.com/lm-sys/FastChat
    • Demo地址: https://chat.lmsys.org/
    • 博客与相关说明: https://vicuna.lmsys.org/
  • 注意
    • 安装教程时间为2023年4月8日,FastChat项目频繁更新,后续可能会有不一致的地方

两个前置软件

  • Git: https://git-scm.com/
    • 代码管理工具,用于等会从GitHub安装huggingface的transformers
    • 直接安装即可,不用改配置
  • Anaconda:https://www.anaconda.com/
    • Python依赖管理工具,用于做Python依赖环境管理,你也可以用其他的管理工具
    • 直接安装即可,不用改配置

创建FastChat虚拟环境

  • 首先,利用Anaconda为FastChat创建一个虚拟环境,执行命令$ conda create -n fastchat python=3.9
    • 如果是Windows系统,你需要先打开Anaconda Prompt
    • 官网要求Python版本要>= 3.8,注意不要安装错版本了
    • 如果Anaconda下载新环境的依赖较慢的话,你可以切换下清华源,命令如下(按顺序)
    conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
    conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
    conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
    conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/pro
    conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
    conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
    conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/
    conda config --set show_channel_urls yes
    
  • 切换到刚才创建好的fastchat虚拟环境,执行 $ conda activate fastchat
  • 这个时候你就切换到了我们为FastChat准备的Python虚拟环境了,接下来可以开始安装我们需要的一些依赖

安装PyTorch

  • 由于FastChat使用的是PyTorch深度学习框架,建议提前安装好PyTorch的依赖
    • 因为官方的源文件有申明PyTorch的依赖,虽然等下安装FastChat时会自动安装PyTorch,但是默认安装的不是带CUDA版本的,到时候重新弄麻烦
    • 而且还能不能指定自己需要的PyTorch版本
  • 具体怎么安装,请参考官方链接 https://pytorch.org/get-started/locally/
    • 根据自己当前的情况选择,官方会给出安装命令
    • 默认是最新的PyTorch2.0,但如果你想使用早一点的版本,请看这里 https://pytorch.org/get-started/previous-versions/
  • 安装命令样例
    • conda $ conda install pytorch torchvision torchaudio cudatoolkit=11.6 -c pytorch -c conda-forge
    • conda $ conda install pytorch==1.13.1 torchvision==0.14.1 torchaudio==0.13.1 pytorch-cuda=11.6 -c pytorch -c nvidia
    • Pip $ pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu117
    • Pip $ pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu116
  • 安装完成后,建议进入Python命令行测试一下,下面是个样例
    (base) PS C:\Users\alion> conda activate fastchat
    (fastchat) PS C:\Users\alion> python
    Python 3.9.16 (main, Mar  8 2023, 10:39:24) [MSC v.1916 64 bit (AMD64)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import torch
    >>> print(torch.__version__)
    1.13.1+cu116
    >>> print(torch.version.cuda)
    11.6
    >>>
    >>> exit()
    (fastchat) PS C:\Users\alion>
    

安装 FastChat

  • 官方有两种安装方式,
    1. 直接利用Pip安装
    2. 下载官方源码后安装
  • 第二种方式可能会出错,建议先直接用第一种(不过你都可以试试,哈哈)
    • 第二种的话,可以有更多的控制性,例如在pyproject.toml文件中移除掉你认为不需要的依赖,或是源码中有错误需要修改
    • 如果用源码装可能会出现错误
      • 信息大概是这样git clone --filter=blob:none --quiet https://github.com/huggingface/transformers.git ... exit code: 128
      • 你先去fastchat项目下,打开pyproject.toml文件,移除掉dependencies中的transformers,等下手动安装pip3 install git+https://github.com/huggingface/transformers
      • 当然这个也可能会卡住,多试几次吧😁
  • 直接执行Pip命令
    • 慢的话可以在Pip命令后面加个清华源 -i https://pypi.tuna.tsinghua.edu.cn/simple
    • 如果github没法访问,请记得开启你的专业工具
      # 安装FastChat
      pip3 install fschat
      
      # 安装 huggingface/transformers
      pip3 install git+https://github.com/huggingface/transformers
      
  • 请确保你已经安装好Git,并在命令行中能使用,否则安装huggingface/transformers时会报错
  • 我已经安装好了,可以看看输出样例
    (fastchat) PS C:\Users\alion> pip3 install fschat
    Requirement already satisfied: fschat in c:\programdata\anaconda3\envs\fastchat\lib\site-packages (0.1.8)
    Requirement already satisfied: tokenizers>=0.12.1 in c:\programdata\anaconda3\envs\fastchat\lib\site-packages (from fschat) (0.13.3)
    Requirement already satisfied: requests in c:\programdata\anaconda3\envs\fastchat\lib\site-packages (from fschat) (2.28.1)
    Requirement already satisfied: torch in c:\programdata\anaconda3\envs\fastchat\lib\site-packages (from fschat) (1.13.1+cu116)
    Requirement already satisfied: wandb in c:\programdata\anaconda3\envs\fastchat\lib\site-packages (from fschat) (0.14.2)
    Requirement already satisfied: uvicorn in c:\programdata\anaconda3\envs\fastchat\lib\site-packages (from fschat) (0.21.1)
    Requirement already satisfied: sentencepiece in c:\programdata\anaconda3\envs\fastchat\lib\site-packages (from fschat) (0.1.97)
    Requirement already satisfied: accelerate in c:\programdata\anaconda3\envs\fastchat\lib\site-packages (from fschat) (0.18.0)
    Requirement already satisfied: numpy in c:\programdata\anaconda3\envs\fastchat\lib\site-packages (from fschat) (1.24.1)
    Requirement already satisfied: fastapi in c:\programdata\anaconda3\envs\fastchat\lib\site-packages (from fschat) (0.95.0)
    Requirement already satisfied: gradio==3.23 in c:\programdata\anaconda3\envs\fastchat\lib\site-packages (from fschat) (3.23.0)
    Requirement already satisfied: markdown2[all] in c:\programdata\anaconda3\envs\fastchat\lib\site-packages (from fschat) (2.4.8)
    # 太多了,中间的我就省略了
    Requirement already satisfied: fonttools>=4.22.0 in c:\programdata\anaconda3\envs\fastchat\lib\site-packages (from matplotlib->gradio==3.23->fschat) (4.39.3)
    Requirement already satisfied: kiwisolver>=1.0.1 in c:\programdata\anaconda3\envs\fastchat\lib\site-packages (from matplotlib->gradio==3.23->fschat) (1.4.4)
    Requirement already satisfied: svgwrite in c:\programdata\anaconda3\envs\fastchat\lib\site-packages (from wavedrom->markdown2[all]->fschat) (1.4.3)
    Requirement already satisfied: smmap<6,>=3.0.1 in c:\programdata\anaconda3\envs\fastchat\lib\site-packages (from gitdb<5,>=4.0.1->GitPython!=3.1.29,>=1.0.0->wandb->fschat) (5.0.0)
    Requirement already satisfied: zipp>=3.1.0 in c:\programdata\anaconda3\envs\fastchat\lib\site-packages (from importlib-resources>=3.2.0->matplotlib->gradio==3.23->fschat) (3.15.0)
    Requirement already satisfied: pyrsistent!=0.17.0,!=0.17.1,!=0.17.2,>=0.14.0 in c:\programdata\anaconda3\envs\fastchat\lib\site-packages (from jsonschema>=3.0->altair>=4.2.0->gradio==3.23->fschat) (0.19.3)
    Requirement already satisfied: uc-micro-py in c:\programdata\anaconda3\envs\fastchat\lib\site-packages (from linkify-it-py<3,>=1->markdown-it-py[linkify]>=2.0.0->gradio==3.23->fschat) (1.0.1)
    (fastchat) PS C:\Users\alion>
    

下载 LLaMA,并转换

  • 由于FastChat基于LLaMA做的二次调参训练,所以我们需要先拿到LLaMA模型文件
  • 官方的获取方式比较麻烦,需要你先填个表单,然后等他们回复,认为可以了才会给你文件
    • hugging face对于LLaMA的说明 https://huggingface.co/docs/transformers/main/model_doc/llama
    • Meta AI的表单填写地址 https://docs.google.com/forms/d/e/1FAIpQLSfqNECQnMkycAp2jP4Z9TFX0cGR4uf7b_fBxjY_OjhJILlKGA/viewform
  • 不过幸运的是,国内有人共享了 LLaMA模型文件
    • 百度PaddlePaddle(只找到个7B的模型) https://aistudio.baidu.com/aistudio/datasetdetail/203425/0
    • 种子链接(包含7B/13B/30B/65B的模型) magnet:?xt=urn:btih:cdee3052d85c697b84f4c1192f43a2276c0daea0&dn=LLaMA
  • 下载后,关于解压或是保存文件的路径中 ,请记得不要有中文、特殊符号等
  • 接下来,我们还需要转换一下LLaMA的文件,以便于构建FastChat对应的模型Vicuna(我资源不够,用的7B模型)
    1. 下载 huggingface/transformers 的源码 $ git clone https://github.com/huggingface/transformers.git
    2. 进入到项目下 $ cd transformers
    3. 利用huggingface/transformers中的代码,完成对于LLaMA的转换,示例$ python src/transformers/models/llama/convert_llama_weights_to_hf.py --input_dir D:/code/model/LLaMA --model_size 7B --output_dir D:/code/model/transformer_model_7b
      • 参数:--input_dir指定的是刚才你下载好的LLaMA文件地址,这个路径下有个tokenizer.model文件,请仔细核对一下
      • 参数:--model_size指定用哪个参数数量级的模型,7B代表的是70亿个参数的那个模型(如果你用的种子链接下载的话,还有13B/30B/65B的模型)
      • 参数:--output_dir 是转换后输出的路径,等下要用

生成FastChat对应的模型Vicuna

  • 接下来我们需要生成Vicuna模型,将原始的LLaMA weights转为Vicuna weights
  • 这个过程需要消耗大量的内存,CPU也是拉满😁,官方给出的参考值如下
    • Vicuna-13B 需要大约60GB内存
    • Vicuna-7B 需要大约30GB内存
  • 确实需要这么多,请准备好足够的内存空间
  • 命令样例如 python -m fastchat.model.apply_delta --base-model-path D:/code/model/transformer_model_7b --target-model-path D:/code/model/vicuna-7b --delta-path lmsys/vicuna-7b-delta-v0
    • 参数:--base-model-path指定的是上一步,我们转换好的LLaMA 文件路径
    • 参数:--target-model-path是接下来生成的Vicuna文件要存放的位置,稍后启动FastChat要用
    • 参数:--delta-path不用改
  • 上面的命令官方已更新(2023-04-13记录),最新安装的同学请换成下面这个:
    • python -m fastchat.model.apply_delta --base-model-path D:/code/model/transformer_model_7b --target-model-path D:/code/model/vicuna-7b --delta-path lmsys/vicuna-7b-delta-v1.1
  • 这个过程较长,需要等下,下面是我的控制台打印信息样例
(fastchat) PS D:\code\transformers> python -m fastchat.model.apply_delta --base-model-path D:/code/model/transformer_model_7b --target-model-path D:/code/model/vicuna-7b --delta-path lmsys/vicuna-7b-delta-v0
Loading base model
Loading checkpoint shards: 100%|█████████████████████████████████████████████████████████| 2/2 [00:03<00:00,  1.63s/it]
Loading delta
Downloading ()lve/main/config.json: 100%|█████████████████████████████████████████████| 619/619 [00:00<00:00, 103kB/s]
Downloading ()model.bin.index.json: 100%|████████████████████████████████████████| 26.8k/26.8k [00:00<00:00, 1.30MB/s]
Downloading ()l-00001-of-00002.bin: 100%|████████████████████████████████████████| 9.98G/9.98G [06:47<00:00, 24.5MB/s]
Downloading ()l-00002-of-00002.bin: 100%|████████████████████████████████████████| 3.50G/3.50G [02:29<00:00, 23.4MB/s]
Downloading shards: 100%|███████████████████████████████████████████████████████████████| 2/2 [09:19<00:00, 279.81s/it]
Loading checkpoint shards: 100%|█████████████████████████████████████████████████████████| 2/2 [00:03<00:00,  1.68s/it]
Downloading ()neration_config.json: 100%|████████████████████████████████████████████| 137/137 [00:00<00:00, 27.3kB/s]
Downloading ()okenizer_config.json: 100%|█████████████████████████████████████████████| 727/727 [00:00<00:00, 121kB/s]
Downloading tokenizer.model: 100%|███████████████████████████████████████████████████| 500k/500k [00:01<00:00, 411kB/s]
Downloading ()cial_tokens_map.json: 100%|█████████████████████████████████████████████| 411/411 [00:00<00:00, 103kB/s]
Applying delta
Applying delta: 100%|████████████████████████████████████████████████████████████████| 323/323 [00:22<00:00, 14.57it/s]
Saving target model
(fastchat) PS D:\code\transformers-main>

启动FastChat的命令行交互

  • 前序工作我们已经准备好了,接下来可以和Vicuna进行命令行式的交流了
  • 执行命令 $ pyhon -m fastchat.serve.cli --model-name D:\code\model\vicuna-7b
    • 如果显卡内存不够,你可以使用CPU $ python -m fastchat.serve.cli --model-name D:\code\model\vicuna-7b --device cpu
    • 如果有多张显卡,可通过--num-gpus 2来指定多张显卡
    • 官方给出的参考值如下
      • 使用显卡的情况下:Vicuna-13B大概需要28GB显存,Vicuna-7B大概需要14GB显存
      • 使用CPU的情况下:Vicuna-13B大概需要60GB内存,Vicuna-7B大概需要30GB内存
  • 上面的命令官方已更新(2023-04-13记录),最新安装的同学请换成下面这个:
    • $ pyhon -m fastchat.serve.cli --model-path D:\code\model\vicuna-7b
  • 稍等一会,就可以正式和Vicuna交流了
  • 下面是一个样例

和Vicuna的交流截图
执行过程中的CPU和内存占用

  • 可以看出来7B模型还是有较大问题的,你可以到官方Demo地址中,拿这个问题问问13B模型
    官方Demo中13B的回答截图

将模型部署为一个服务,提供Web GUI

  • 启动 controller
    • 新打开命令行,进入到fastchat环境 $ conda activate fastchat
    • 执行命令 $ python -m fastchat.serve.controller
  • 启动 model worker
    • 新打开命令行,进入到fastchat环境 $ conda activate fastchat
    • 执行命令 $ python -m fastchat.serve.model_worker --model-path D:\code\model\vicuna-7b
    • 同样,如果你显卡内存不够,需要使用CPU,在后面加上参数--device cpu
  • 关于controller和model worker的说明
    • controller用来控制协调Webserver的请求,将具体的任务转给model worker
    • model worker负责执行,可以部署多个,会自动链接到controller
  • 启动前可以测试一下
    • 新打开命令行,进入到fastchat环境 $ conda activate fastchat
    • 执行 $ python -m fastchat.serve.test_message --model-name vicuna-7b
  • 最后,启动 web server,执行 python -m fastchat.serve.gradio_web_server
  • 打开浏览器,访问地址 http://127.0.0.1:7860/
    在这里插入图片描述

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

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

相关文章

Cesium:自定义MaterialProperty

在项目中应用Cesium.js时,时常遇到需要对Cesium.js的Material材质或者MaterialProperty材质属性进行拓展的应用场景。如果对GLSL(openGL Shading Language ),即:OpenGL着色语言熟悉的话,参考Cesium官方文档,构建一个新的Material必定不是难事。而MaterialProperty材质属…

【C语言进阶:动态内存管理】动态内存函数的介绍

本节重点内容&#xff1a; malloc 和 free 函数calloc 函数realloc 函数&#x1f338;为什么存在动态内存分配 到目前为止&#xff0c;我们已经掌握的内存开辟方式有两种&#xff1a; 创建变量&#xff1a;int val 20; //在栈空间上开辟四个字节 创建数组&#xff1…

Html5钢琴块游戏制作与分享(音游可玩)

当年一款手机节奏音游&#xff0c;相信不少人都玩过或见过。最近也是将其做了出来分享给大家。 游戏的基本玩法&#xff1a;点击下落的黑色方块&#xff0c;弹奏音乐。&#xff08;下落的速度会越来越快&#xff09; 可以进行试玩&#xff0c;手机玩起来效果会更好些。 点击…

【Python】基于serial的UART串口通信(可实现AT指令自动化 以ML307A开发板为例)

【Python】基于serial的UART串口通信&#xff08;可实现AT指令自动化 以ML307A开发板为例&#xff09; Python下的串口serial库 串行口的属性&#xff1a; name:设备名字 portstr:已废弃&#xff0c;用name代替 port&#xff1a;读或者写端口 baudrate&#xff1a;波特率 byt…

Charles 安装及配置,详细步骤(不错,保存一下)

一、安装激活 1.1、下载 https://www.charlesproxy.com/download/ 1.2、激活 打开Charles > Help > Register Charles > 输入 Registered Name &#xff1a; https://zhile.io License Key&#xff1a;48891cf209c6d32bf4 二、代理配置 2.1、代理设置 Proxy > Pr…

Nodejs中的fs模块

一、文件写入操作 writeFile 直接打开文件默认是 w 模式&#xff0c;所以如果文件存在&#xff0c;该方法写入的内容会覆盖旧的文件内容 语法&#xff1a; writeFile(file, data[, options], callback)异步writeFileSync(file, data)同步 参数&#xff1a; file文件名data要…

MYSQL 2:一条更新语句是如何进行的

一. MYSQL的一条更新语句如何进行的&#xff1f; 和查询一样&#xff0c;一开始我们需要通过连接器连接到MYSQL服务器上&#xff0c;然后我们会将我们的语句交给解析器&#xff0c;然后交给执行器。比如我们执行一条这样的语句 update cc1 from user_info where id 2 1.执行…

PTA:C课程设计(5)

山东大学&#xff08;威海&#xff09;2022级大一下C习题集&#xff08;5&#xff09;函数题5-6-1 求一组数中的平均值及最大值5-6-2 判断满足条件的三位数5-6-3 函数实现字符串逆序5-6-4 查找子串5-6-5 计算最长的字符串长度5-6-6 二分查找编程题5-7-1 找最长的字符串5-7-2 藏…

第七天sql优化篇

一、查询SQL尽量不要使用select *&#xff0c;而是select具体字段 因为select * 进行查询时&#xff0c;很可能就不会使用到覆盖索引了&#xff0c;就会造成回表查询 select stu.name from student stu; 二、如果知道查询结果只有一条或者只要最大/最小一条记录&#xff…

CMMI认证唯一查询官网

CMMI是“能力成熟度模型集成”的意思。是一种评估或者认证制度。最新的CMMI V2.0模型有四个视图&#xff0c;DEV开发视图、SVC服务视图、供应商、人力资源&#xff0c;目前开发视图是全球应用最广泛的&#xff0c;主要是由CMMI研究院主任评估师按照CMMI模型检查企业或组织的软件…

HTML - 实现IE浏览器访问网址自动跳转至谷歌浏览器打开

HTML - 实现IE浏览器访问网址自动跳转至谷歌浏览器打开一. 实现代码二. IE浏览器设置一. 实现代码 注意&#xff1a;代码中的数据变量需要使用 var 声明 核心代码var href "http://www.baidu.com" //创建ActiveXObject实例&#xff0c;只在IE下有效&#xff0c;才可…

TensorFlow详解2原理

一、从helloworld开始 二、Tensorflow编程模式 一般有两种编程模式。 第一种是命令式编程–Torch&#xff0c; 第二种是符号式编程–Tensorflow; tensorflow比torch有相对的一定的优化&#xff1b; 命令式编程实际上是一种最常见的编程模式&#xff0c;因为易于理解而且基本没…

怎么压缩pdf,如何压缩pdf大小,4种高质量办法

怎么压缩pdf&#xff0c;如何压缩pdf大小&#xff0c;如何找到最合适、最高效的方法&#xff0c;是每一个人必须认真对待的问题。那么我们如何能提高工作效率呢&#xff1f;在办公中我们首先就是要先制定工作计划&#xff0c;心中有机会才能合理的安排工作时间&#xff0c;这样…

工业企业清洁运输台账存在的问题及应对措施

按照超低排放政策规定&#xff0c;企业要实现清洁运输超低排放改造&#xff0c;除了提高企业大宗物料和清洁方式运输比例外&#xff0c;同时还要建立清洁运输台账&#xff0c;根据台账等数据资料判断企业清洁运输比例是否满足要求。而目前对于大多数未完成超低排放的企业来说&a…

Nand Flash基础知识

1、Nand Flash组织架构 Device&#xff08;Package&#xff09;就是封装好的nand flash单元&#xff0c;包含了一个或者多个target。一个target包含了一个或者多个LUN&#xff0c;一个target的一个或者多个LUN共享一组数据信号。每个target都由一个ce引脚&#xff08;片选&…

07-vue的组件化

文章目录1.概述存在的问题&#xff1a;那么如何解决这种状况&#xff1a;2.组件化1.基本概述2.优点1.概述 对于前端来说&#xff0c;我们为用户创造价值才是特别需要关注的一个问题&#xff0c;这么多年过去了&#xff0c;前端到底为用户创造了什么价值呢&#xff1f; 70 年代…

Nacos2.2版本Tomcat启动报错

Nacos2.2版本Tomcat启动报错 错误日志 查看 logs/start.out&#xff0c;可以看到报错信息 2023-04-09 19:36:23,081 ERROR Error starting Tomcat context. Exception: org.springframework.beans.factory.UnsatisfiedDependencyException. Message: Error creating bean wi…

Linux系统上如何禁用 USB 存储

Linux系统上如何禁用 USB 存储 为了保护数据不被泄漏&#xff0c;我们使用软件和硬件防火墙来限制外部未经授权的访问&#xff0c;但是数据泄露也可能发生在内部。 为了消除这种可能性&#xff0c;机构会限制和监测访问互联网&#xff0c;同时禁用 USB 存储设备。 我是艾西&…

手写一个Promise

Promise Promise是一个对象&#xff0c;用于解决异步变成的问题&#xff0c;由传统的异步回调为服务端立即调用优化为使用者者掌握回调主动权。 比如传统的JSONP&#xff0c;如下&#xff0c;在请求路由里添加回调函数&#xff0c;由接收请求的一方来调用请求&#xff0c;使用…

小白学Pytorch系列--Torch.nn API Vision Layers(15)

小白学Pytorch系列–Torch.nn API Vision Layers(15) 方法注释nn.PixelShuffle将形状张量(∗&#xff0c;Cr2,H,W)(*&#xff0c;C r^2,H,W)(∗&#xff0c;Cr2,H,W)中的元素重新排列为形状张量(∗&#xff0c;C,Hr,Wr)(*&#xff0c;C,H r,W r)(∗&#xff0c;C,Hr,Wr)&#x…