【AI实战】从零开始搭建中文 LLaMA-33B 语言模型 Chinese-LLaMA-Alpaca-33B

news2024/11/23 22:03:30

【AI实战】从零开始搭建中文 LLaMA-33B 语言模型 Chinese-LLaMA-Alpaca-33B

    • 简介
    • 环境配置
      • 环境搭建
      • 依赖安装
    • 代码及模型权重拉取
      • 拉取 Chinese-LLaMA-Alpaca
      • 拉取 llama-30b-hf 模型权重及代码
      • 拉取 chinese-llama-lora-33b 模型权重及代码
    • 合并模型权重
      • 先转换 pth 类型的模型权重,验证模型权重
      • 合并后检查SHA256
      • 再合并 huggingface 类型的模型权重
    • 搭建测试页面
      • 拉取 text-generation-webui
      • 加载模型并启动 webui
    • 参考

简介

2023年2月25日消息,Meta 推出了一种针对研究社区的基于人工智能 (AI) 的新型大型语言模型,与微软、谷歌等一众受到 ChatGPT 刺激的公司一同加入人工智能竞赛。

Meta 的 LLaMA 是“大型语言模型 Meta AI” (Large Language Model Meta AI)的缩写,它可以在非商业许可下提供给政府、社区和学术界的研究人员和实体工作者。

开源的模型包括参数(7B、13B、33B 和 65B)的 LLaMA。其中,LLaMA 65B 和 LLaMA 33B 在 1.4 万亿个 tokens 上训练,而最小的模型 LLaMA 7B 也经过了 1 万亿个 tokens 的训练。

与其他大型语言模型一样,LLaMA 的工作原理是将一系列单词作为“输入”并预测下一个单词以递归生成文本。为了这套模型,Meta 从使用人数最多的 20 种语言中选择文本进行训练,重点是拉丁语和西里尔字母。

本文重点介绍基于 LLaMA-33B 语言模型 Chinese-LLaMA-Alpaca-33B 从零开始搭建的完整过程。

环境配置

环境搭建

  • 系统环境

    • Ubuntu 20.04LTS
    • NVIDIA TESLA P40
    • CUDA 11.7
    • cuDNN 8
    • Docker 18.09.5
  • 创建docker容器

    拉取docker镜像

    docker pull nvcr.io/nvidia/pytorch:21.08-py3
    

    创建docker

    nvidia-docker run -it -d \
        --name llama \
        -v /llm:/notebooks \
        -p 28888:8888 \
        -p 28889:8889 \
        -e TZ='Asia/Shanghai' \
        --shm-size 16G \
        nvcr.io/nvidia/pytorch:21.08-py3
    

    修改 /llm 为自己的路径

    进入容器内:

    docker exec -it llama  env LANG=C.UTF-8 /bin/bash
    
  • 安装conda

    下载:

    cd /notebooks
    wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
    

    安装:

    bash Miniconda3-latest-Linux-x86_64.sh
    

    安装提升安装即可

    将miniconda加入PATH路径:

    export PATH="/root/miniconda3/bin:$PATH"
    

    创建 conda 环境:

    conda create -n llama_30b python=3.10.9
    
  • 安装依赖库

    conda activate llama_30b
    conda init
    

    exit退出docker,重新进入docker

    docker exec -it llama  env LANG=C.UTF-8 /bin/bash
    cd /notebooks
    conda activate llama_30b
    
  • 内存要求

    在这里插入图片描述

依赖安装

请安装指定版本,否则合并后无法比对SHA256校验值:

pip install torch==1.13.1 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install torchvision==0.14.1  -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install torchaudio==0.13.1 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install transformers==4.28.1 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install sentencepiece==0.1.97 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install peft==0.3.0 -i https://pypi.tuna.tsinghua.edu.cn/simple

代码及模型权重拉取

拉取 Chinese-LLaMA-Alpaca

git clone https://github.com/ymcui/Chinese-LLaMA-Alpaca.git

github网站偶尔会抽风,需要耐心等待,如果失败了,执行 rm -rf Chinese-LLaMA-Alpaca,再重新拉取

拉取 llama-30b-hf 模型权重及代码

git clone https://huggingface.co/decapoda-research/llama-30b-hf

由于权重文件特别大,如果失败了,执行 rm -rf llama-30b-hf,再重新拉取。
建议中午时间拉取,速度比较快,大概2-3小时(和你的网络带宽有很大关系!)。

文件大小查看:

du -sh llama-30b-hf

输出:

154G    llama-30b-hf

查看文件列表:

ls -l llama-30b-hf/

输出:

total 80723436
-rw-r--r-- 1 root root      10646 Jul  4 11:59 LICENSE
-rw-r--r-- 1 root root       8313 Jul  4 11:59 README.md
-rw-r--r-- 1 root root        427 Jul  4 11:59 config.json
-rw-r--r-- 1 root root        124 Jul  4 11:59 generation_config.json
-rw-r--r-- 1 root root 1337620210 Jul  4 13:53 pytorch_model-00000-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 12:15 pytorch_model-00001-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 12:15 pytorch_model-00002-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 12:14 pytorch_model-00003-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 12:15 pytorch_model-00004-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 12:14 pytorch_model-00005-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 12:14 pytorch_model-00006-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 12:15 pytorch_model-00007-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 12:14 pytorch_model-00008-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 12:29 pytorch_model-00009-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 12:29 pytorch_model-00010-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 12:29 pytorch_model-00011-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 12:30 pytorch_model-00012-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 12:29 pytorch_model-00013-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 12:29 pytorch_model-00014-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 12:29 pytorch_model-00015-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 12:30 pytorch_model-00016-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 12:44 pytorch_model-00017-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 12:44 pytorch_model-00018-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 12:44 pytorch_model-00019-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 12:45 pytorch_model-00020-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 12:44 pytorch_model-00021-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 12:44 pytorch_model-00022-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 12:44 pytorch_model-00023-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 12:45 pytorch_model-00024-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 12:59 pytorch_model-00025-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 12:59 pytorch_model-00026-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 12:59 pytorch_model-00027-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 12:59 pytorch_model-00028-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 12:59 pytorch_model-00029-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 13:00 pytorch_model-00030-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 12:59 pytorch_model-00031-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 13:00 pytorch_model-00032-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 13:14 pytorch_model-00033-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 13:14 pytorch_model-00034-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 13:14 pytorch_model-00035-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 13:14 pytorch_model-00036-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 13:14 pytorch_model-00037-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 13:14 pytorch_model-00038-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 13:15 pytorch_model-00039-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 13:15 pytorch_model-00040-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 13:16 pytorch_model-00041-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 13:29 pytorch_model-00042-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 13:53 pytorch_model-00043-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 13:29 pytorch_model-00044-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 13:29 pytorch_model-00045-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 13:53 pytorch_model-00046-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 13:29 pytorch_model-00047-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 13:48 pytorch_model-00048-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 13:29 pytorch_model-00049-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 13:29 pytorch_model-00050-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 13:31 pytorch_model-00051-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 13:44 pytorch_model-00052-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 13:44 pytorch_model-00053-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 13:44 pytorch_model-00054-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 13:44 pytorch_model-00055-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 13:44 pytorch_model-00056-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 13:44 pytorch_model-00057-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 13:44 pytorch_model-00058-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 13:45 pytorch_model-00059-of-00061.bin
-rw-r--r-- 1 root root 1337620210 Jul  4 13:29 pytorch_model-00060-of-00061.bin
-rw-r--r-- 1 root root 1064974796 Jul  4 13:47 pytorch_model-00061-of-00061.bin
-rw-r--r-- 1 root root      47653 Jul  4 11:59 pytorch_model.bin.index.json
-rw-r--r-- 1 root root          2 Jul  4 11:59 special_tokens_map.json
-rw-r--r-- 1 root root     499723 Jul  4 13:44 tokenizer.model
-rw-r--r-- 1 root root        141 Jul  4 11:59 tokenizer_config.json

拉取 chinese-llama-lora-33b 模型权重及代码

git clone https://huggingface.co/ziqingyang/chinese-llama-lora-33b

文件大小查看:

du -sh chinese-llama-lora-33b

输出:

5.5G    chinese-llama-lora-33b

查看文件列表:

ls -l chinese-llama-lora-33b

输出:

total 2836532
-rw-r--r-- 1 root root        315 Jul  4 15:46 README.md
-rw-r--r-- 1 root root        421 Jul  4 15:46 adapter_config.json
-rw-r--r-- 1 root root 2903823997 Jul  4 15:51 adapter_model.bin
-rw-r--r-- 1 root root         72 Jul  4 15:46 special_tokens_map.json
-rw-r--r-- 1 root root     757958 Jul  4 15:46 tokenizer.model
-rw-r--r-- 1 root root        166 Jul  4 15:46 tokenizer_config.json

合并模型权重

先转换 pth 类型的模型权重,验证模型权重

cd ./Chinese-LLaMA-Alpaca
mkdir ./Chinese-LLaMA-33B
python scripts/merge_llama_with_chinese_lora.py \
    --base_model ../llama-30b-hf/ \
    --lora_model ../chinese-llama-lora-33b/ \
    --output_type pth  \
    --output_dir ./Chinese-LLaMA-33B-pth

输出的模型权重文件保存到:./Chinese-LLaMA-33B-pth

合并后检查SHA256

生成SHA256

cd ./Chinese-LLaMA-33B-pth
sha256sum consolidated.0*

输出:

054e9b7dffa3b92a053ca32acac6e22b27c184ed2b8563f8e44e6570ba416357  consolidated.00.pth
a0fe86c45a0819f45a509776d82778b7de75fbff8d37afa97159b24de5448b7b  consolidated.01.pth
13df5f74dc7bc1204076b1febef818fb3cec978de27bf8fc85c70e7d62282df9  consolidated.02.pth
f4f28106c343c5804613faa9852f29fbc60764366bcb0d37ef2811a17be2d336  consolidated.03.pth

下面是 Chinese-LLaMA-33B 标准的 SHA256

054e9b7dffa3b92a053ca32acac6e22b27c184ed2b8563f8e44e6570ba416357
a0fe86c45a0819f45a509776d82778b7de75fbff8d37afa97159b24de5448b7b
13df5f74dc7bc1204076b1febef818fb3cec978de27bf8fc85c70e7d62282df9
f4f28106c343c5804613faa9852f29fbc60764366bcb0d37ef2811a17be2d336

两者完全一致,则说明合并成功;否则检测一下下载的数据是否完整、一致。

再合并 huggingface 类型的模型权重

cd ./Chinese-LLaMA-Alpaca
mkdir ./Chinese-LLaMA-33B
python scripts/merge_llama_with_chinese_lora.py \
    --base_model ../llama-30b-hf/ \
    --lora_model ../chinese-llama-lora-33b/ \
    --output_type huggingface  \
    --output_dir ./Chinese-LLaMA-33B-2

输出的模型权重文件保存到:./Chinese-LLaMA-33B

total 77G
-rw-r--r-- 1 root root  573 Jul  5 02:15 config.json
-rw-r--r-- 1 root root  132 Jul  5 02:15 generation_config.json
-rw-r--r-- 1 root root  12G Jul  5 02:15 pytorch_model-00001-of-00007.bin
-rw-r--r-- 1 root root  12G Jul  5 02:16 pytorch_model-00002-of-00007.bin
-rw-r--r-- 1 root root  12G Jul  5 02:16 pytorch_model-00003-of-00007.bin
-rw-r--r-- 1 root root  12G Jul  5 02:18 pytorch_model-00004-of-00007.bin
-rw-r--r-- 1 root root  12G Jul  5 02:19 pytorch_model-00005-of-00007.bin
-rw-r--r-- 1 root root  12G Jul  5 02:20 pytorch_model-00006-of-00007.bin
-rw-r--r-- 1 root root 7.6G Jul  5 02:21 pytorch_model-00007-of-00007.bin
-rw-r--r-- 1 root root  49K Jul  5 02:21 pytorch_model.bin.index.json
-rw-r--r-- 1 root root   72 Jul  5 02:15 special_tokens_map.json
-rw-r--r-- 1 root root 741K Jul  5 02:15 tokenizer.model
-rw-r--r-- 1 root root  727 Jul  5 02:15 tokenizer_config.json

搭建测试页面

使用text generation webui搭建页面

拉取 text-generation-webui

git clone https://github.com/oobabooga/text-generation-webui
cd text-generation-webui
pip install -r requirements.txt

其中,requirements.txt:

accelerate==0.20.3
colorama
datasets
einops
flexgen==0.1.7
gradio_client==0.2.5
gradio==3.33.1
markdown
numpy
pandas
Pillow>=9.5.0
pyyaml
requests
safetensors==0.3.1
sentencepiece
tqdm
scipy

加载模型并启动 webui

mkdir logs

python server.py --model-dir /notebooks/Chinese-LLaMA-Alpaca --model Chinese-LLaMA-33B --model_type LLaMA --listen --listen-host 0.0.0.0 --listen-port 8888 --auto-devices 
  • 测试

    地址:http://10.192.x.x:28888/

    界面截图

  • 我的推理速度:
    Output generated in 832.65 seconds (0.09 tokens/s, 73 tokens, context 6, seed 233442323)

参考

https://github.com/ymcui/Chinese-LLaMA-Alpaca
使用text-generation-webui搭建界面
https://github.com/ymcui/Chinese-LLaMA-Alpaca/blob/main/SHA256.md

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

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

相关文章

docker版jenkins安装node打包vue2

下载node 通过jenkins配置下载因为某些原因会失败,故自己下载安装https://nodejs.org/zh-cn/download解压然后复制到docker的jenkins容器 tar -xvf node-v16.18.1-linux-x64.tar.xzdocker cp ./node-v16.18.1-linux-x64 jenkins:/node配置 jenkins-全局工具配置- …

【Vim编辑器】编码技巧:模板(自动添加信息)+配置参考(~/.vimrc)

前言: 在编写代码时,为了提高代码的可读性和维护性,我们经常在文件的头部添加一些信息提示,如作者、日期、版本号等。本文介绍了如何在 Vim 编辑器中实现自动添加信息提示的功能。 结尾提供~/.vimr参考配置,可提高代码…

短视频seo矩阵+抖音小程序源码开源部署(二)

一、 开发思路: 通过短视频seo矩阵抖音小程序的形式,实现视频的批量制作,小程序内容批量挂载,客户线索批量收集,实现企业运营价值最大化。开发逻辑:通过短视频矩阵布局seo搜索关键词,接入小程序…

Elasticsearch:文档版本控制和乐观并发控制

在今天的文章中,我来详细描述一下 Elasticsearch 文档的版本控制以及如何更新文档。你也可以阅读我之前的文章 “Elasticsearch:深刻理解文档中的 verision 及乐观并发控制”。 版本控制 我们知道 Elasticsearch 的每个文档都有一个相对应的版本。这个版…

GO微服务简介及特性介绍

微服务特性 一、微服务简介-构建单体应用 互联网技术发展迅速的今天,微服务倍受关注:文章、博客、社交媒体讨论和会议演讲都在谈论。与此同时,也有持怀疑态度的软件社区人员认为微服务没什么新鲜可言。反对者声称它的思想只是面向服务架构的…

Windows系统安装JAVA步骤流程(超详细)

超详细的Windows系统安装JAVA步骤流程,Windows操作系统安装java,先下载JDK,然后配置环境变量,阿里云百科分享详细安装流程如下: 目录 Window操作系统安装java流程 下载JDK 配置环境变量 JAVA_HOME 设置 PATH设置…

Centos安装RabbitMQ

#安装 yum install rabbitmq-server #启动 systemctl start rabbitmq-server #查看状态 systemctl status rabbitmg-server #安装管理插件 rabbitmg-plugins enable rabbitmg_management #新增admin账号 rabbitmqctl add_user admin admin #设置为管理员 rabbitmqctl set_user_…

电子电气架构——车载DoIP通信

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 人们会在生活中不断攻击你。他们的主要武器是向你灌输对自己的怀疑:你的价值、你的能力、你的潜力。他们往往会将此伪装成客观意见,但无一例外的是…

基于FreeRTOS的嵌入式设备管理关键技术研究及实现(学习二)

嵌入式操作系统FreeRTOS FreeRTOS是一个专门为轻量级嵌入式应用设计的迷你操作系统,它的主要功能由IPC、时钟管理、内存管理、任务通知以及任务调度等部分构成。 FreeRTOS的代码可以分解为三个主要区块:任务调度、通讯、硬件库。 任务调度:F…

windows环境安装robotframework-ride

在Windows环境下,可以通过以下步骤安装Robot Framework RIDE: 安装Python 首先,需要在Windows环境下安装Python。建议使用Python 3.x版本,可以从官方网站下载并安装:https://www.python.org/downloads/windows/ 安装w…

shiro登录认证

一,创建数据库 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0; -- ---------------------------- -- Table structure for user -- ---------------------------- DROP TABLE IF EXISTS user; CREATE TABLE user ( uid int(11) NOT NULL AUTO_INCREMENT, uname va…

opencv中Rect()类与rectangle()函数详解

文章目录 Rect()矩形类1、实例化 Rect() 类:(1)构造函数: 2、Rect类的成员函数(1)rect.size() 和 rect.area() 和 rect.width() 和 rect.height(),用来描述矩形的宽度,高度&#xff…

SQL专家云回溯某时间段内的阻塞

背景 SQL专家云像“摄像头”一样,对环境、参数配置、服务器性能指标、活动会话、慢语句、磁盘空间、数据库文件、索引、作业、日志等几十个运行指标进行不同频率的实时采集,保存到SQL专家云自己的数据库中。因此可以随时对任何一个时间段进行回溯。 趋势…

基于C++、GDAL、OpenCV的矢量数据骨架线提取算法

基于C、GDAL、OpenCV的矢量数据骨架线提取算法 CGAL已经实现了该功能,但由于CGAL依赖于Boost库,编译后过大,因此本文所采用的这套方式实现骨架线提取功能。 效果: 思路: 1、将导入shp按照要素逐一拆分成新的shp 2、…

java中如何将一个集合list转成以逗号隔开的字符串

事例代码 代码&#xff1a; package com.air.app;import java.util.ArrayList; import java.util.List;public class ListToStringTest {public static void main(String[] args) {//定义list集合List<String> list new ArrayList<>();list.add("1");…

SolidUI AI生成可视化,开创性开源项目,版本0.1.0 功能讲解

文章目录 背景项目名字含义登录页含义产品思维0.1.0 版本内涵功能列表数据源管理项目管理设计页面 背景 随着文本生成图像的语言模型兴起&#xff0c;SolidUI想帮人们快速构建可视化工具&#xff0c;可视化内容包括2D,3D,3D场景&#xff0c;从而快速构三维数据演示场景。Solid…

多元分类预测 | Matlab基于麻雀算法优化深度置信网络(SSA-DBN)的分类预测,多特征输入模型,SSA-DBN分类预测

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元分类预测 | Matlab基于麻雀算法优化深度置信网络(SSA-DBN)的分类预测,多特征输入模型,SSA-DBN分类预测 多特征输入单输出的二分类及多分类模型。程序内注释详细,直接替换数据就可以用。程序语言为matlab,程…

linux_driver_day03

作业1 题目&#xff1a; 通过ioctl函数选择不同硬件的控制&#xff0c;LED 蜂鸣器 马达 风扇 代码&#xff1a; 代码太多只展示 led 部分&#xff0c;点击查看完整代码 led.c #include "led.h" #include "head.h"static void all_led_init(void);stati…

问题1:矩阵置零 问题2:搜索二维矩阵

问题1&#xff1a;矩阵置零 给定一个 *m* x *n* 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 解题思路&#xff1a; 1.先遍历一遍矩阵&#xff0c;将元素为0的行和列都标记为true 2.再遍历一遍矩阵&#xff0c…

Element 实现动态增加多个输入框并校验

文章目录 前言实现通过按钮动态增加表单并验证必填实现动态多个输入框为行内模式&#xff0c;其它为行外模式 前言 在做复杂的动态表单&#xff0c;实现业务动态变动&#xff0c;比如有一条需要动态添加的el-form-item中包含了多个输入框&#xff0c;并实现表单验证&#xff0…