XTuner 微调实践微调
步骤 0. 使用 conda 先构建一个 Python-3.10 的虚拟环境
cd ~
#git clone 本repo
git clone https://github.com/InternLM/Tutorial.git -b camp4
mkdir -p /root/finetune && cd /root/finetune
conda create -n xtuner-env python=3.10 -y
conda activate xtuner-env
步骤 1. 安装 XTuner
此处推荐用我 freeze 的 requirements.txt,更多的安装方法请回到前面看 XTuner 文档
cd /root/Tutorial/docs/L1/XTuner
pip install -r requirements.txt
修改提供的数据
步骤 0. 创建一个新的文件夹用于存储微调数据
mkdir -p /root/finetune/data && cd /root/finetune/data
cp -r /root/Tutorial/data/assistant_Tuner.jsonl /root/finetune/data
步骤 1. 创建修改脚本
我们写一个脚本生成修改我们需要的微调训练数据,在当前目录下创建一个 change_script.py 文件,内容如下:
创建 change_script.py
文件
touch /root/finetune/data/change_script.py
打开该change_script.py文件后将下面的内容复制进去。
import json
import argparse
from tqdm import tqdmdef process_line(line, old_text, new_text):# 解析 JSON 行data = json.loads(line)# 递归函数来处理嵌套的字典和列表def replace_text(obj):if isinstance(obj, dict):return {k: replace_text(v) for k, v in obj.items()}elif isinstance(obj, list):return [replace_text(item) for item in obj]elif isinstance(obj, str):return obj.replace(old_text, new_text)else:return obj# 处理整个 JSON 对象processed_data = replace_text(data)# 将处理后的对象转回 JSON 字符串return json.dumps(processed_data, ensure_ascii=False)def main(input_file, output_file, old_text, new_text):with open(input_file, 'r', encoding='utf-8') as infile, \open(output_file, 'w', encoding='utf-8') as outfile:# 计算总行数用于进度条total_lines = sum(1 for _ in infile)infile.seek(0) # 重置文件指针到开头# 使用 tqdm 创建进度条for line in tqdm(infile, total=total_lines, desc="Processing"):processed_line = process_line(line.strip(), old_text, new_text)outfile.write(processed_line + '\n')if __name__ == "__main__":parser = argparse.ArgumentParser(description="Replace text in a JSONL file.")parser.add_argument("input_file", help="Input JSONL file to process")parser.add_argument("output_file", help="Output file for processed JSONL")parser.add_argument("--old_text", default="尖米", help="Text to be replaced")parser.add_argument("--new_text", default="闻星", help="Text to replace with")args = parser.parse_args()main(args.input_file, args.output_file, args.old_text, args.new_text)
然后修改如下: 打开 change_script.py ,修改 --new_text 中 default=“闻星” 为你的名字。
> if __name__ == "__main__":
>
> parser = argparse.ArgumentParser(description="Replace text in a JSONL file.")
>
> parser.add_argument("input_file", help="Input JSONL file to process")
>
> parser.add_argument("output_file", help="Output file for processed JSONL")
>
> parser.add_argument("--old_text", default="尖米", help="Text to be replaced")
> - parser.add_argument("--new_text", default="闻星", help="Text to replace with")
> + parser.add_argument("--new_text", default="你的名字", help="Text to replace with")
>
> args = parser.parse_args()
步骤 2. 执行脚本
usage:python change_script.py {input_file.jsonl} {output_file.jsonl}
cd ~/finetune/data
python change_script.py ./assistant_Tuner.jsonl ./assistant_Tuner_change.jsonl
assistant_Tuner_change.jsonl 是修改后符合 XTuner 格式的训练数据。
步骤 3. 查看数据
cat assistant_Tuner_change.jsonl | head -n 3
训练启动
步骤 0. 复制模型
在InternStudio开发机中的已经提供了微调模型,可以直接软链接即可。
本模型位于/root/share/new_models/Shanghai_AI_Laboratory/internlm2_5-7b-chat
mkdir /root/finetune/models
ln -s /root/share/new_models/Shanghai_AI_Laboratory/internlm2_5-7b-chat /root/finetune/models/internlm2_5-7b-chat
步骤 1. 修改 Config
获取官方写好的 config
cd {path/to/finetune}
cd /root/finetune
mkdir ./config
cd config
xtuner copy-cfg internlm2_5_chat_7b_qlora_alpaca_e3 ./
修改以下几行
#######################################################################
# PART 1 Settings #
#######################################################################
- pretrained_model_name_or_path = 'internlm/internlm2_5-7b-chat'
+ pretrained_model_name_or_path = '/root/finetune/models/internlm2_5-7b-chat'- alpaca_en_path = 'tatsu-lab/alpaca'
+ alpaca_en_path = '/root/finetune/data/assistant_Tuner_change.jsonl'evaluation_inputs = [
- '请给我介绍五个上海的景点', 'Please tell me five scenic spots in Shanghai'
+ '请介绍一下你自己', 'Please introduce yourself'
]#######################################################################
# PART 3 Dataset & Dataloader #
#######################################################################
alpaca_en = dict(type=process_hf_dataset,
- dataset=dict(type=load_dataset, path=alpaca_en_path),
+ dataset=dict(type=load_dataset, path='json', data_files=dict(train=alpaca_en_path)),tokenizer=tokenizer,max_length=max_length,
- dataset_map_fn=alpaca_map_fn,
+ dataset_map_fn=None,template_map_fn=dict(type=template_map_fn_factory, template=prompt_template),remove_unused_columns=True,shuffle_before_pack=True,pack_to_max_length=pack_to_max_length,
use_varlen_attn=use_varlen_attn)
除此之外,我们还可以对一些重要的参数进行调整,包括学习率(lr)、训练的轮数(max_epochs)等等。
步骤 2. 启动微调
完成了所有的准备工作后,我们就可以正式的开始我们下一阶段的旅程:XTuner 启动~!
当我们准备好了所有内容,我们只需要将使用 xtuner train 命令令即可开始训练。
xtuner train 命令用于启动模型微调进程。该命令需要一个参数:CONFIG 用于指定微调配置文件。这里我们使用修改好的配置文件 internlm2_5_chat_7b_qlora_alpaca_e3_copy.py。
训练过程中产生的所有文件,包括日志、配置文件、检查点文件、微调后的模型等,默认保存在 work_dirs 目录下,我们也可以通过添加 --work-dir 指定特定的文件保存位置。–deepspeed 则为使用 deepspeed, deepspeed 可以节约显存。
运行命令进行微调
```bash
cd /root/finetune
conda activate xtuner-env
xtuner train ./config/internlm2_5_chat_7b_qlora_alpaca_e3_copy.py --deepspeed deepspeed_zero2 --work-dir ./work_dirs/assistTuner
步骤 3. 权重转换
模型转换的本质其实就是将原本使用 Pytorch 训练出来的模型权重文件转换为目前通用的 HuggingFace 格式文件,那么我们可以通过以下命令来实现一键转换。
我们可以使用 xtuner convert pth_to_hf 命令来进行模型格式转换。
xtuner convert pth_to_hf 命令用于进行模型格式转换。该命令需要三个参数:CONFIG 表示微调的配置文件, PATH_TO_PTH_MODEL 表示微调的模型权重文件路径,即要转换的模型权重, SAVE_PATH_TO_HF_MODEL 表示转换后的 HuggingFace 格式文件的保存路径。
除此之外,我们其实还可以在转换的命令中添加几个额外的参数,包括:
参数名 解释
–fp32 代表以fp32的精度开启,假如不输入则默认为fp16
–max-shard-size {GB} 代表每个权重文件最大的大小(默认为2GB)
cd /root/finetune/work_dirs/assistTunerconda activate xtuner-env
先获取最后保存的一个pth文件
pth_file=`ls -t /root/finetune/work_dirs/assistTuner/*.pth | head -n 1 | sed 's/:$//'`
export MKL_SERVICE_FORCE_INTEL=1
export MKL_THREADING_LAYER=GNU
xtuner convert pth_to_hf ./internlm2_5_chat_7b_qlora_alpaca_e3_copy.py ${pth_file} ./hf
转换完成后,可以看到模型被转换为 HuggingFace 中常用的 .bin 格式文件,这就代表着文件成功被转化为 HuggingFace 格式了。
此时,hf 文件夹即为我们平时所理解的所谓 “LoRA 模型文件”
可以简单理解:LoRA 模型文件 = Adapter
步骤 4. 模型合并
对于 LoRA 或者 QLoRA 微调出来的模型其实并不是一个完整的模型,而是一个额外的层(Adapter),训练完的这个层最终还是要与原模型进行合并才能被正常的使用。
对于全量微调的模型(full)其实是不需要进行整合这一步的,因为全量微调修改的是原模型的权重而非微调一个新的 Adapter ,因此是不需要进行模型整合的。
在 XTuner 中提供了一键合并的命令 xtuner convert merge,在使用前我们需要准备好三个路径,包括原模型的路径、训练好的 Adapter 层的(模型格式转换后的)路径以及最终保存的路径。
xtuner convert merge命令用于合并模型。该命令需要三个参数:LLM 表示原模型路径,ADAPTER 表示 Adapter 层的路径, SAVE_PATH 表示合并后的模型最终的保存路径。
在模型合并这一步还有其他很多的可选参数,包括:
参数名 解释
–max-shard-size {GB} 代表每个权重文件最大的大小(默认为2GB)
–device {device_name} 这里指的就是device的名称,可选择的有cuda、cpu和auto,默认为cuda即使用gpu进行运算
–is-clip 这个参数主要用于确定模型是不是CLIP模型,假如是的话就要加上,不是就不需要添加
cd /root/finetune/work_dirs/assistTuner
conda activate xtuner-envexport MKL_SERVICE_FORCE_INTEL=1
export MKL_THREADING_LAYER=GNU
xtuner convert merge /root/finetune/models/internlm2_5-7b-chat ./hf ./merged --max-shard-size 2GB
模型合并完成后,我们的目录结构应该是这样子的。
在模型合并完成后,我们就可以看到最终的模型和原模型文件夹非常相似,包括了分词器、权重文件、配置信息等等。
模型 WebUI 对话
微调完成后,我们可以再次运行 xtuner_streamlit_demo.py 脚本来观察微调后的对话效果,不过在运行之前,我们需要将脚本中的模型路径修改为微调后的模型的路径。
cd ~/Tutorial/tools/L1_XTuner_code
# 直接修改脚本文件第18行
- model_name_or_path = "Shanghai_AI_Laboratory/internlm2_5-7b-chat"
+ model_name_or_path = "/root/finetune/work_dirs/assistTuner/merged"
然后,我们可以直接启动应用。
conda activate xtuner-env
pip install streamlit==1.31.0
streamlit run /root/Tutorial/tools/L1_XTuner_code/xtuner_streamlit_demo.py
运行后,确保端口映射正常,如果映射已断开则需要重新做一次端口映射。
ssh -p {ssh端口,从InternStudio获取} root@ssh.intern-ai.org.cn -CNg -L 7860:127.0.0.1:8501 -o StrictHostKeyChecking=no
ssh -p 36356 root@ssh.intern-ai.org.cn -CNg -L 7860:127.0.0.1:8501 -o StrictHostKeyChecking=no
可以访问http://localhost:7860/,进入下面的界面:
相关文章:
XTuner 微调实践微调
步骤 0. 使用 conda 先构建一个 Python-3.10 的虚拟环境 cd ~ #git clone 本repo git clone https://github.com/InternLM/Tutorial.git -b camp4 mkdir -p /root/finetune && cd /root/finetune conda create -n xtuner-env python3.10 -y conda activate xtuner-env…...
docker compose
Docker的理念是一个容器只运行一个服务。而 Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具 1 2。通过 docker-compose.yml 文件,用户可以配置应用程序服务,并使用简单的一条命令便可以创建和启动所有服务。这是关于 Docker Compose …...
Java 中的方法重写
在 Java 中,方法重写(Method Overriding)是面向对象编程的一个重要概念,它指的是子类中存在一个与父类中相同名称、相同参数列表和相同返回类型的方法。方法重写使得子类可以提供特定的实现,从而覆盖(或改变…...
阿里云ECS服务器域名解析
阿里云ECS服务器域名解析,以前添加两条A记录类型,主机记录分别为www和,这2条记录都解析到服务器IP地址。 1.进入阿里云域名控制台,找到域名 ->“解析设置”->“添加记录” 2.添加一条记录类型为A,主机记录为www,…...
非父子通信(扩展)-- event bus 事件总线
创建一个空实例Bus, export default 导出Bus 过程:由A组件对Bus组件进行监听,B组件触发Bus对应的事件,由于A组件进行监听,触发事件之后就会进行A组件的回调,那么就可以将消息发送给A了 在src文件夹下新建utils文件夹&a…...
【Linux系列】获取当前目录
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
大模型:把GPT搬回家 - chatGPT的本地化API -Node.js调用
chatGPT拒绝了中国大陆和中国香港的访问,包括api的调用。这使得我们无法使用目前来讲确实YYLX的生产工具,仔细想一下其实还是可以曲线解决的,本文的介绍仅供学习参考。 用Node.jschatGPT提供的API,就可以在自己本地或者自己的服务…...
【Qt项目实战】使用脚本拓展CPP应用程序(2)——Lua脚本及编辑器
考古 《【Qt项目实战 】:使用脚本拓展CPP应用程序(1)——Lua脚本及编辑器》 一、LuaBridge 最近在项目的某个模块再次使用Lua作为程序拓展语言,开发了一些新的功能。 这里借助 LuaBridge 轻松实现Qt调用C类成员函数及成员对象等…...
【RBF SBN READ】hadoop社区基于RBF的SBN READ请求流转
读写分离功能的背景及架构 当前联邦生产集群的各个子集群只有Active NameNode在工作,当读写任务变得繁忙的时候,只有一个Active负责处理的话,此时集群的响应和处理能力业务侧感知会明显下降,为此,我们将引入Observer架构,实现读写功能的分离,使得Active只负责写请求,而…...
【教学类-36-08】20241210对称蝴蝶——去白边(图案最大化)一大和一大二小
背景需求 前期制作了对称蝴蝶,用来涂色,幼儿很喜欢 【教学类-36-07】20230707三只对称蝴蝶(midjounery-niji)(涂色、裁剪、游戏(飞舞的蝴蝶))_对称图案涂色-CSDN博客文章浏览阅读49…...
Flume——sink连接hdfs的参数配置(属性参数+时间参数)
这可不是目录 配置文件官网说明属性参数时间参数 配置文件官网说明 可以参考官网的说明 属性参数 属性名称默认值说明channel-type-组件类型名称,必须是hdfshdfs.path-HDFS路径,例如:hdfs://mycluster/flume/mydatahdfs.filePrefixFlumeDa…...
lc字符串相加——模拟
415. 字符串相加 - 力扣(LeetCode) 不准调用封装好的那些库。手动模拟两数相加,记录进位。主要当其中短的数字计算完了怎么办,技巧为下标为负数时就当做0,相当于补0一样。 class Solution {public String addStrings…...
框架建设实战6——缓存组件
说起分布式缓存,如今redis大行其道。不过,我们在创建缓存组件时,需要着重考虑如下几点: 1.客户端选型 本组件基于springboot2的默认实现,即lettuce客户端。不同客户端区别如下: 名称描述 优缺点分析 jedis1.springboot1.5.*默认 2.老牌客户端,使用稳定…...
基于springboot使用Caffeine
Caffeine 是一个基于 Java 的高性能、现代化的缓存库。它由 Ben Manes 开发,受 Google Guava 缓存库的启发,但具有更好的性能和更多的功能。 Caffeine 的核心特点 高性能 基于 Java 8 的现代化设计,利用高级并发算法,提供极低的延…...
深入解析 JavaScript 中的 Blob 对象:二进制数据处理的核心
文章目录 1.Blob是什么2.Blob用法实例属性Blob方法slice方法text方法 示例1:字符串 Blob示例2:数组和字符串 Blob示例3:从文件输入创建 3.使用场景1.创建 Blob 并生成 URL,下载文件2.文件上传3.切片上传3.Blob用于URL在线预览PDF文…...
fastboot
Fastboot 是 Android 和嵌入式开发中常见的一个低级工具,它允许通过 USB 与设备直接交互,用于分区的管理和系统的刷写等任务。以下是其工作原理和核心机制的解析: 1. Fastboot 的基本概念 Fastboot 是一种通信协议,通常在设备的引…...
yosys内部数据结构
一、参考链接 1.Yosys内部结构doxygen文件 yosys-master: RTLIL Namespace Reference 2.yosys内部结构介绍 https://yosyshq.readthedocs.io/projects/yosys/en/docs-preview-cellhelp/yosys_internals/formats/rtlil_rep.html 二、概览 图 1 网表核心数据结构 如图 1所示…...
前端导出excel实战(xlsx库和exceljs库)
一. 概览 前端导出excel是比较常见的需求,比如下载excel模板和批量导出excel。目前比较常用的库有xlsx和excel,接下来就着两种方式进行梳理。 二. 下载模板 xlsx库实现: 示例核心代码如下: const excelColumn {details: {ma…...
TCP/IP杂记
TCP三次握手、四次挥手 从应用角度,不用多考虑为什么有三次,遵循标准即可。 ubuntu 下 wireshark安装: sudo add-apt-repository universe sudo apt install wireshark 三次握手实证: 第一次握手的情况如下:&#…...
深入解析 Spring Security —— 打造高效安全的权限管理体系
目录 前言1. 初识 Spring Security1.1 Spring Security 的两大核心功能1.2 Spring Security 的主要特点 2. 配置 Spring Security2.1 配置类概述2.2 基础配置示例2.3 示例解析 3. Spring Security 的进阶功能3.1 自定义用户服务3.2 注解式权限控制3.3 动态权限控制 4. 实战应用…...
PostGIS分区表学习相关
在Postgresql中对空间数据进行表分区的实践_postgresql空间数据-CSDN博客文章浏览阅读1.4k次,点赞26次,收藏21次。Postgresql的分区功能允许将一个大表按照特定的规则拆分成多个小的分区表。这样做的好处在于,在查询数据时,可以只…...
避大坑!Vue3中reactive丢失响应式的问题
在vue3中,我们定义响应式数据无非是ref和reactive。 但是有的小伙伴会踩雷!导致定义的响应式丢失的问题。 reactive丢失响应式的情况1(直接赋值) 场景: 1.你定义了一个数据:let datareactive({name:"",age:"" }) 2.然后你…...
绿虫光伏设计系统:清洁能源的未来
煤炭、石油、天然气是我们现在依赖的重要能源,但这些能源难以再生,而且开采过程中会产生污染。太阳能发电作为清洁能源的一种重要形式,受到了越来越多的关注。绿虫光伏发电系统,不仅考虑到其发电效率,还可以考虑其经济…...
Python中的文件操作与数据处理
一、前言 文件操作是数据处理和持久化存储的基础。Python内置了强大的文件操作能力,并提供了丰富的库支持复杂数据处理需求。本文将从基础的文件读写到高效的数据处理,带您全面掌握Python文件操作技能。 二、文件操作基础 1. 文件的读写 # 写入文件 with open("examp…...
在huggingface.co的Spaces中推理,得到错误:No space left on device
如果你的前几次或者上一次推理运行成功了,或者至少GPU加载过了,导致你这次问题的原因可能是某种缓存文件太大 删除它试试,如果你的推理没有在运行,这不影响任何东西 rm -rf /data-nvme/zerogpu-offload/如果有帮助,请…...
el-table expand-row-keys默认展开,数据更新后默认展开的问题
开发项目时遇到个问题,菜单展开后,刷新数据,再次点击收起按钮不好用了,要点两次才好使,解决方案如下: 1、table设置 <el-table:loading"load":data"menuDataList":load"load…...
Linux下redis环境的搭建
1.redis的下载 redis官网下载redis的linux压缩包,官网地址:Redis下载 网盘链接: 通过网盘分享的文件:redis-5.0.4.tar.gz 链接: https://pan.baidu.com/s/1cz3ifYrDcHWZXmT1fNzBrQ?pwdehgj 提取码: ehgj 2.redis安装与配置 将包上传到 /…...
海外的bug-hunters,不一样的403bypass
一种绕过403的新技术,跟大家分享一下。研究HTTP协议已经有一段时间了。发现HTTP协议的1.0版本可以绕过403。于是开始对lyncdiscover.microsoft.com域做FUZZ并且发现了几个403Forbidden的文件。 (访问fsip.svc为403) 在经过尝试后࿰…...
使用 EasyExcel 提升 Excel 处理效率
目录 前言1. EasyExcel 的优点2. EasyExcel 的功能3. 在项目中使用 EasyExcel3.1 引入依赖3.2 实体类的定义与注解3.3 工具类方法的实现3.4 在 Controller 中使用 4. 总结5. 参考地址 前言 在日常开发中,Excel 文件的处理是不可避免的一项任务,特别是在…...
驱鸟器自定义播放音乐,低成本语音方案选型-N9305九芯电子
一、开发背景: 随着农业现代化的不断推进,鸟类对农作物的侵扰问题愈发严重。传统的驱鸟方法,如人工驱赶或使用化学药剂,不仅效率低下,而且可能对环境造成污染。因此,开发一种高效、环保、低成本的驱鸟器成…...
【html css选择器】
在 CSS 中,你可以通过选择器来选择 HTML 元素,并为其设置样式。以下是一些常见的 CSS 选择器和样式设置方法: 1. 基本选择器 元素选择器:选择特定的 HTML 元素。 p {color: blue;font-size: 16px; }类选择器:选择具有…...
mongoDb的读session和写session权限报错问题
go在使用mongoDb时用到了全局会话,发现在创建的session的逻辑相同,首先会进行数据的查询,此时获取了全局session执行读操作,查询所有文档,则当前会话为读会话,当再去插入时发现会报错,此时sessi…...
如何避免缓存击穿?超融合常驻缓存和多存储池方案对比
作者:SmartX 解决方案专家 钟锦锌 很多运维人员都知道,混合存储介质配置可能会带来“缓存击穿”的问题,尤其是大数据分析、数据仓库等需要频繁访问“冷数据”的应用场景,缓存击穿可能会更频繁地出现,影响业务运行。除…...
c语言专题之单链表的实现
在之前的博客中小编已经讲解了顺序表及其应用,所以在将讲单链表之前,我们先来重新思考一下顺序表,这里我先来讲顺序表的几个小缺点: 1.顺序表中在我们数据时,如头插、在指定位置插入等,我们通常需要整体挪动…...
Spring 源码学习(七)——注解后处理器
通过之前对注解式配置的解析(Spring 源码学习(三)—— 注解式配置解析_spring源码学习-CSDN博客)可以发现其使用 AnnotationConfigUtils 类的 registerAnnotationConfigProcessors 静态方法对象注解后处理器对象进行注册ÿ…...
GEE训练教程——基于 Sentinel-1 数据对 Felső-Kiskunság 湖区的可视化分析
目录 简介 代码解释 代码 结果 简介 GEE训练教程——基于 Sentinel-1 数据对 Felső-Kiskunsg 湖区的可视化分析 此处打开后运行后直接在script界面上就可以输入指定的年份和月份,但不是GEE APP的运算,是直接在弹出的框内输入即可。 代码解释 以下是您提供的 Google …...
docker 相关操作
1. 以下是一些常见的 Docker 命令: docker --version显示安装的 Docker 版本。 docker pull <image_name>从 Docker Hub 或其他镜像仓库下载镜像。 docker build -t <image_name> <path>从指定路径的 Dockerfile 构建 Docker 镜像。 docker i…...
【汽车】-- 燃油发动机3缸和4缸
3缸和4缸燃油发动机是小轿车常见的发动机配置。以下从结构特点、性能、经济性等方面对两者进行对比,并分析优缺点及使用注意事项: 1. 结构与运行原理 3缸发动机 特点:少一个气缸,内部零部件更少,整体结构更紧凑。优点…...
Python - 处理包含非utf-8 的字符编码
有这样的字符串,utf-8 编码中包含 ascii 编码内容 你好\x0a\x0a哈哈s 你好\x0a\x0a哈哈 b s.encode(utf-8) b.decode(utf-8)其它尝试 >>> b s.encode(utf-8) >>> b.decode(ascii) Traceback (most recent call last):File "<stdin&g…...
主坐标分析(PCoA)
主坐标分析(PCoA)是一种多变量统计方法,用于研究样本间的相似性或差异性,是一种非约束性的数据降维分析方法。以下是PCoA的关键点和实施步骤: 什么是PCoA? PCoA通过将样本距离矩阵转换为坐标,…...
Linux 网络接口配置
在 Linux 中,网络接口配置文件用于控制系统中的软件网络接口,并通过接口实现对网络设备的控制。当系统启动时,系统通过这些接口配置文件决定启动哪些接口,以及如此对这些接口进行配置. 在 Linux 中,网络接口配置文件用于控制系统中的软件网络接口,并通过这些接口实现对网络…...
Netty客户端接收不到服务端发送的数据问题
文章目录 前言问题描述相关代码解决方法 前言 环境 JDK:64位 jdk1.8.0_201 Netty:4.1.39.Final 问题描述 项目中使用Netty接受客户端的消息,客户端为硬件设备,在接受数据后发送数据到服务端。 同时因为客户端没有联网ÿ…...
基于多视角深度学习技术的乳腺X线分类:图神经网络与Transformer架构的研究|文献速递-生成式模型与transformer在医学影像中的应用速递
Title 题目 Mammography classification with multi-view deep learning techniques:Investigating graph and transformer-based architectures 基于多视角深度学习技术的乳腺X线分类:图神经网络与Transformer架构的研究 01 文献速递介绍 乳腺X线检查是乳腺癌…...
SCRM私域流量管理工具助力企业微信电商转型升级
内容概要 在当今数字化时代,SCRM(社交客户关系管理)私域流量管理工具正逐渐成为企业转型的重要助力。尤其是在电商领域,企业微信的兴起为许多公司打开了新的销售渠道,通过SCRM系统的高效整合,企业能够更加…...
PTA 输出三角形字符阵列
本题要求编写程序,输出n行由大写字母A开始构成的三角形字符阵列。 输入格式: 输入在一行中给出一个正整数n(1≤n<7)。 输出格式: 输出n行由大写字母A开始构成的三角形字符阵列。格式见输出样例,其中…...
纯血鸿蒙崛起,原生Android挑战?两大操作系统巅峰对决,智能设备未来谁主沉浮?
鸿蒙HarmonyOS和原生Android系统虽然在一些方面相似,但在架构、设计理念、API、开发工具等方面存在一些差异。鸿蒙系统的目标是跨设备、分布式的操作系统,强调多设备协同和资源共享,而Android则主要集中在智能手机和移动设备领域。 下面将从…...
书生实战营第四期-进阶岛第六关-MindSearch 快速部署
一、开发环境配置 1、打开codespace主页,选择Blank模板进行创建 Codespaces 2、创建conda环境隔离并安装依赖 conda create -n mindsearch python3.10 -y conda init 因为是新建的codespace,在第一次创建conda环境时,需要conda init 然后再…...
【Cadence32】PCB多层板电源、地平面层创建心得➕CM约束管理器Analyze分析显示设置➕“DP”报错DRC
【转载】Cadence Design Entry HDL 使用教程 【Cadence01】Cadence PCB Edit相对延迟与绝对延迟的显示问题 【Cadence02】Allegro引脚焊盘Pin设置为透明 【Cadence03】cadence不小心删掉钢网层怎么办? 【Cadence04】一般情况下Allegro PCB设计时的约束规则设置&a…...
华东理工大学2001年数据结构与程序设计试题
华东理工大学2001年数据结构与程序设计试题 一、单选题(10分) 1.若某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用——存储方式最节省运算时间。 A.单链表 B.仅有头指针的单循环链表 Cÿ…...
WebRTC 的核心:RTCPeerConnection
WebRTC 的核心:RTCPeerConnection WebRTC 的核心:RTCPeerConnection 创建 RTCPeerConnection 对象RTCPeerConnection 与本地音视频数据绑定媒体协商ICE 什么是 Candidate?收集 Candidate交换 Candidate尝试连接 SDP 与 Candidate 消息的互换…...