【飞桨AI实战】PaddleNLP大模型指令微调,从0打造你的专属家常菜谱管家

news2024/9/20 5:54:41

1.项目背景

家庭烹饪作为日常生活的重要组成部分,不仅关乎健康,也是家庭情感交流的重要方式。

相信很多小伙伴在烹饪时也会困惑:不知道如何选择合适的食材和菜谱,或者缺乏灵感来创造新的菜品。

最近看到一本《家庭实用菜谱大全》,就想能不能结合它做一款推荐家常菜谱的专属大模型出来。

PaddleNLP大模型套件是一个基于飞桨(PaddlePaddle)开发的大语言模型(LLM)开发库,提供了大量的预训练 LLM 和高级 API,本次分享我们将尝试用飞桨的大模型套件,进行指令微调,做一款能够推荐菜品、具体食材和做法的大模型。

先简单画一个框架图,盘点一下本项目的具体工作,希望给感兴趣的同学一点大模型应用上的参考和帮助。

2. 百度 AI Studio 平台

本次将采用 AI Studio 平台中的免费 GPU 资源,在平台注册账号后,点击创建项目-选择 NoteBook 任务,然后添加数据集,如下图所示,完成项目创建。启动环境选择 GPU 资源。

创建项目的方式有两种:

  • 一是在 AI Studio 平台参考如下方式,新建项目。

  • 二是直接 fork 一个平台上的已有项目,选择【PaddleNLP大模型微调】从0打造你的专属家常菜谱管家
    的最新版本,点击 fork,成功后会在自己账号下新建项目副本,其中已经挂载了项目数据集和核心代码。

在这里插入图片描述

为了快速跑通项目流程,建议直接 fork 源项目。

3. 开始实战

3.1 菜谱数据生成

注:大模型微调使用的对话数据,已经上传到数据集中,可直接跳转到 3.2 进行微调使用。本节将主要介绍数据的制作过程,供感兴趣的同学参考。

首先我们准备一个虚拟环境,这样每次重启项目时,无需重新安装项目依赖

打开一个终端,在根目录下创建一个虚拟环境:

conda create -p /home/aistudio/envs/bot python=3.10

一键启动虚拟环境:

source activate /home/aistudio/envs/bot/

进入项目目录,安装相关依赖:

cd /home/aistudio/recipe_bot/
pip install -r requirements.txt

3.1.1 文本提取

本次用于菜谱信息提取的文档,存放在加载的数据集中:/home/aistudio/data/data290409/家庭实用菜谱大全.pdf

参考代码:/home/aistudio/recipe_bot/core.py

我们首先需要将文档中的文本信息提取出来,可以采用两种方法:

  • 方式一:PDF 文字提取:选用 PyPDF2
  • 方式一:文字识别 OCR,选用 PaddleOCR

方式一实现:

from PyPDF2 import PdfReader
def pypdf_to_txt(input_pdf, output_path='data/pypdf'):
    if not os.path.exists(output_path):
        os.makedirs(output_path)
    pdf_reader = PdfReader(input_pdf)
    # 遍历PDF的每一页
    for page_num in tqdm(range(len(pdf_reader.pages)), desc='pypdf_to_txt'):
        page = pdf_reader.pages[page_num]
        text = page.extract_text()
        # 将文本写入txt文件
        with open(f'{output_path}/{page_num:03d}.txt', "w", encoding="utf-8") as f:
            f.write(text)
if __name__ == '__main__':
    pypdf_to_txt('/home/aistudio/data/data290409/家庭实用菜谱大全.pdf')

方式二实现:

from paddleocr import PaddleOCR
ppocr = PaddleOCR(use_angle_cls=True, debug=False)

def img_ocr(img_path=None, img_data=None):
    if img_data is not None:
        img = img_data
    else:
        img = cv2.imread(img_path)
    result = ppocr.ocr(img)[0]
    texts = []
    if result:
        for line in result:
            # box = line[0]
            text = line[1][0]
            texts.append(text)
    return '\n'.join(texts)

def pdfocr_to_txt(input_pdf, output_path='data/ocr'):
    if not os.path.exists(output_path):
        os.makedirs(output_path)
    pdf_document = fitz.open(input_pdf)
    # 遍历PDF的每一页
    for page_num in tqdm(range(pdf_document.page_count)):
        if os.path.exists(f'{output_path}/{page_num:03d}.txt'):
            continue
        page = pdf_document.load_page(page_num)
        pm = page.get_pixmap()
        pm.save("temp.png")
        img = cv2.imread("temp.png")
        texts = img_ocr(img_data=img)
        with open(f'{output_path}/{page_num:03d}.txt', "w", encoding="utf-8") as f:
            f.write(texts)
if __name__ == '__main__':
    pdfocr_to_txt('/home/aistudio/data/data290409/家庭实用菜谱大全.pdf')

上述代码会将每一页文本内容提取出来保存成 .txt 文件,给大家展示下两种方法提取的结果(左-方法一,右-方法二):

我们发现,单纯的 OCR 无法胜任文档结构化任务,相对方法二,方法一PyPDF2提取的内容更符合预期一点,不过依然不是我们想要的内容。

此时,不得不祭出最擅长文本结构化的 LLM 了~

3.1.2 文本结构化

LLM 我们选择直接调用百度开放的 ErnieBot API,省去本地部署的麻烦。

参考代码:/home/aistudio/recipe_bot/llm.py

注:调用 ErnieBot API,需要在代码中指定erniebot.access_token,可以通过如下方式获取:右上角账号头像-个人中心-访问令牌。

首先,编写对话代码:

def chat_completion(text='', system='', messages=[], model='ernie-3.5'):
    if not messages:
        messages = [{'role': 'user', 'content': text}]
    response = erniebot.ChatCompletion.create(
        model=model,
        messages=messages,
        system=system
    )
    return response.get_result()

然后,编写给 LLM 的角色提示词:

system_reorg = '''
您是经验丰富的星级大厨和文档解析大师,擅长从图片中提取的文本中精准提取出结构化信息。我会给你文本内容,其中包括3-4道菜谱内容,因为文本内容是通过OCR识别出来的,所以内容有些错乱,您需要从中提取出每道菜的【菜名、材料、调料、做法、特点和厨师一点通】,并整理成markdown格式输出。
要求:
1. 直接回答提取内容即可,不要回答其他任何内容。
2. 整理成markdown格式输出,但不需要加```markdown和```。
3. 输出的markdown格式如下:
## 菜名1
### 材料
- 材料1 - 数量/重量
--- 此处省略,完整提示词可参考项目代码 ---
'''

下面,编写批量化处理代码:

# 获取菜品信息
def get_recipe_info(input_path='data/pypdf', output_path='data/md/recipe'):
    if not os.path.exists(output_path):
        os.makedirs(output_path)
    files = os.listdir(input_path)
    for file in tqdm(files):
        output_file = os.path.join(output_path, file.replace('.txt', '.md'))
        if os.path.exists(output_file):
            continue
        text = open(os.path.join(input_path, file), 'r').read()
        result = chat_completion(text=text, system=system_reorg)
        if result:
            with open(output_file, 'w') as f:
                f.write(result)
if __name__ == '__main__':
    get_recipe_info()

给大家看下 ErnieBot 提取的结果:

整体还是符合预期的,其中 高汤·大匙(具体量未给出),是因为文本并未识别成功,LLM 自然无法给出。

接下来,我们还要提取目录信息,同样编写角色提示词让 LLM 帮我们搞定:

最终,我们在 data/md 文件夹下得到两份 .json 文件,recipe.jsondirectory.json,分别是结构化的菜谱数据和分类数据:

怎么把上述数据,转换成可供大模型微调的数据呢?

3.1.3 对话数据生成

参考飞桨大模型精调文档,PaddleNLP支持的数据格式是每行一个字典,每个字典包含以下字段:

  • src : str, List(str), 模型的输入指令(instruction)、提示(prompt),模型应该执行的任务。
  • tgt : str, List(str), 模型的输出。
  • context(可选):在训练过程中动态调整 system prompt,传入 system 字段。

为此,参考上述格式,我们可以编写如下函数生成对话数据

def get_sft_data():
    context = {'system': '您是一位五星级大厨,擅长回答关于一切有关菜谱的问题,包括菜品推荐,食材选择,具体做法等等。'}
    results = []
    # 生成和类别相关的问题
    dir_dict = json.load(open('data/md/directory.json', 'r'))
    for cate, name_list in dir_dict.items():
        for i in range(10):
            src = f'请您帮我推荐几道关于{cate}的菜品'
            tgt = random.sample(name_list, random.randint(2, min(len(name_list), 10)))
            results.append({'src': src, 'tgt': '\n'.join(tgt), 'context': context})
        for i in range(10):
            num = random.randint(2, min(len(name_list), 10))
            src = f'请您帮我推荐{num}道关于{cate}的菜品'
            tgt = random.sample(name_list, num)
            results.append({'src': src, 'tgt': '\n'.join(tgt), 'context': context})
    # 生成和菜名相关的问题
    rec_dict = json.load(open('data/md/recipe.json', 'r'))
    for title, content_dict in rec_dict.items():
        material = '\n'.join(content_dict.get('材料', ''))
        if not material.strip():
            continue
        seasonings = '\n'.join(content_dict.get('调料', ''))
        steps = '\n'.join(content_dict.get('做法', ''))
        charcter = '\n'.join(content_dict.get('特点', ''))
        tips = '\n'.join(content_dict.get('厨师一点通', ''))
        src = f'{title}这道菜需要准备些什么食材和调料'
        tgt = f'{title}这道菜需要准备的食材有:{material},调料有:{seasonings}'
        results.append({'src': src, 'tgt': tgt, 'context': context})
        src = f'{title}这道菜怎么做'
        if tips:
            tgt = f'{title}这道菜的具体做法如下:{steps},最后再给你点小建议:{tips}'
        else:
            tgt = f'{title}这道菜的具体做法如下:{steps}'
        results.append({'src': src, 'tgt': tgt, 'context': context})
        if charcter:
            src = f'{title}这道菜有什么特点'
            tgt = f'{title}的特点是:{charcter}'
            results.append({'src': src, 'tgt': tgt, 'context': context})
            src = f'我今天想吃点{charcter}的菜,你可以帮我推荐一道菜么'
            tgt = f'没问题,{title}这道菜{charcter},需要准备的食材有:{material},调料有:{seasonings},具体做法如下:{steps},最后再给你点小建议:{tips}'
            results.append({'src': src, 'tgt': tgt, 'context': context})
    random.shuffle(results)
    with open('data/sft_data.json', 'w') as f:
        f.write(json.dumps(results, ensure_ascii=False, indent=4))

上述代码分别生成:和类别相关的问题,和菜名相关的问题,共计 2083 条用于训练,我们随机抽取 100 条用于验证。

训练 & 验证数据放在了:/home/aistudio/data/data290409/:

  • train.json
  • dev.json

感兴趣的小伙伴,也可参考上述代码自行生成。

3.2 LLM 指令微调

数据准备好之后,我们开启 LLM 指令微调。

3.2.1 环境准备

首先,打开一个终端,下载 PaddleNLP 并安装依赖:

git clone https://github.com/PaddlePaddle/PaddleNLP.git
cd /home/aistudio/PaddleNLP/
pip install --upgrade paddlenlp==3.0.0b0
pip install paddlepaddle-gpu==3.0.0b1 -i https://www.paddlepaddle.org.cn/packages/stable/cu118/

为了方便大家快速跑通流程,这里我们选用 Qwen/Qwen2-0.5B 进行简单测试:

from paddlenlp.transformers import AutoTokenizer, AutoModelForCausalLM
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2-0.5B")
model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2-0.5B", dtype="float16")
input_features = tokenizer("你好!请自我介绍一下。", return_tensors="pd")
outputs = model.generate(**input_features, max_length=128)
print(tokenizer.batch_decode(outputs[0]))

Qwen/Qwen2-0.5B推理大概占用 4G 显存。

3.2.2 数据准备

微调需要进入 llm 目录:

cd /home/aistudio/PaddleNLP/llm

然后准备训练数据,我们在第一步已经生成,直接软链接过来:

mkdir data_sft
ln -s /home/aistudio/data/data290409/train.json data_sft/train.json
ln -s /home/aistudio/data/data290409/dev.json data_sft/dev.json

下面将开始进行模型训练,LLM 微调包括多种方式,这里我们选用最常见的两种方式进行展示。

  • SFT 全参微调:对模型的所有参数进行微调,需要更多的计算资源和时间,特别是对参数量巨大的模型
  • LoRA 微调:一种参数高效的微调方法,基于 LLM 的内在低秩特性,通过增加旁路矩阵来模拟全参数微调。只训练新增参数,而保持原始参数固定,训练速度更快。

两种微调的脚本均为:python run_finetune.py,唯一的区别是指定不同的配置文件。

接下来,你需要根据自己的配置选择一个 LLM,如果你选择的是 16G 显存的 V100,那么 7B 以上的模型都是跑不了的。

为了方便大家快速跑通流程,下面我们选用 Qwen/Qwen2-0.5B 进行指令微调。SFT 全参微调LoRA 微调 的配置文件分别在:config/qwen/sft_argument.jsonconfig/qwen/lora_argument.json

3.2.3 SFT 全参微调

首先,修改配置文件config/qwen/sft_argument.json,需要修改的几个地方如下:

"model_name_or_path": "Qwen/Qwen2-0.5B", # 指定选用的模型
"dataset_name_or_path": "./data_sft", # 指定数据集位置
"output_dir": "./checkpoints/sft_ckpts",# 指定训练输出模型权重的存放位置

"bf16": false,
"fp16": true,
"use_flash_attention": false

特别注意

  • 如果选用的是 V100,不能使用 “bf16” 和 “use_flash_attention”。因为 V100 的 Compute Capability 为 7.0,不支持 bf16 计算,如需使用,可切换到飞桨的 A100 环境。
  • 如果选用的是 A100,且使用"bf16" 和 “use_flash_attention”,需安装 PaddleNLP 自定义 OP。
cd /home/aistudio/PaddleNLP/csrc
pip install -r requirements.txt
python setup_cuda.py install

# 安装成功,提示如下:
Installed /home/aistudio/envs/bot/lib/python3.10/site-packages/paddlenlp_ops-0.0.0-py3.10-linux-x86_64.egg

配置文件准备好之后,一键开启训练:

python run_finetune.py ./config/qwen/sft_argument.json

给大家展示下:不同训练配置下,训练时长对比:

  • fp16 不用 flash attention

  • fp16 用 flash attention

  • bf16 用 flash attention

所以,flash attention 的提速还是很显著的!

bf16(BFloat16)和fp16(Float16)是两种不同的浮点数表示格式,有什么区别?

  • bf16:1位符号位,8位指数,7位尾数。
  • fp16:1位符号位,5位指数,10位尾数。

所以,bf16 指数范围更大,适合处理大范围的数值,可以减少内存带宽需求,同时保持较好的数值稳定性。,而 fp16 尾数精度更高,适合需要更高精度的小数运算。

3.2.4 LoRA 微调

首先,修改配置文件config/qwen/lora_argument.json,需要修改的几个地方,参考 SFT 全参微调 即可。

配置文件准备好之后,一键开启训练:

python run_finetune.py ./config/qwen/lora_argument.json

训练结束后,还需将 lora 参数合并到主干模型中:

python merge_lora_params.py \
    --model_name_or_path /home/aistudio/.paddlenlp/models/Qwen/Qwen2-0.5B \
    --lora_path ./checkpoints/lora_ckpts \
    --output_path ./checkpoints/lora_merge \
    --device "gpu" \
    --safe_serialization True

脚本参数介绍:

  • model_name_or_path: 主干模型参数路径。
  • lora_path: LoRA参数路径。
  • output_path: 合并参数后保存路径。

3.2.5 推理测试&结果对比

我们采用最简单的推理脚本对训练后的模型进行测试:

from paddlenlp.transformers import AutoTokenizer, AutoModelForCausalLM
model_name = "/home/aistudio/.paddlenlp/models/Qwen/Qwen2-0.5B"
# model_name = "/home/aistudio/PaddleNLP/llm/checkpoints/sft_ckpts/"
# model_name = "/home/aistudio/PaddleNLP/llm/checkpoints/lora_merge"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name, dtype="float16")
input_features = tokenizer("我今天想吃点鲜香诱人,润滑爽口的菜,你可以帮我推荐一道么", return_tensors="pd")
outputs = model.generate(**input_features, max_length=512)
print(tokenizer.batch_decode(outputs[0]))

对于问题:我今天想吃点鲜香诱人,润滑爽口的菜,你可以帮我推荐一道么

不同模型的回答,对比如下:

  • Qwen/Qwen2-0.5B
['? 你好,我可以帮你推荐一道菜。请问你想要吃什么口味的菜呢?比如辣、甜、咸、酸等等。<|im_start|>']
  • SFT 全参微调
['?没问题,爽口鱼片这道菜鲜香诱人,润滑爽口,需要准备的食材有:鲩鱼·1条(约750克)\n红辣椒·1个\n泡椒·适量\n泡萝卜·适量\n生姜·1小块\n大蒜·3瓣\n香菜·1棵\n淀粉·适量,调料有:香油·2小匙\n高汤·大匙(具体量未给出)\n香醋·1小匙\n精盐·1小匙\n味精·小匙(具体量未给出),具体做法如下:1. 将泡萝卜、泡椒、辣椒洗净后分别切成丁,均匀地垫在盘底。\n2. 将鱼宰杀洗净,把鱼肉切成片,放入沸水中氽熟,捞出码在已垫底料的盘上,淋上香油拌匀即可。,最后再给你点小建议:鱼肉切片后用凉水浸泡一会,口感会更好。注:鲩鱼即草鱼。<|im_end|>鱼肉切片后用凉水浸泡一会,口感会更好。<|im_end|>鱼片用沸水氽熟,捞出后用凉水浸泡一会,口感会更好。<|im_end|>鱼片用沸水氽熟,捞出后用凉水浸泡一会,口感会更好。<|im_end|>鱼片用沸水氽熟,捞出后用凉水浸泡一会,口感会更好。<|im_end|>鱼片用沸水氽熟,捞出后用凉水浸泡一会,口感会更好。<|im_end|>鱼片用沸水氽熟,捞出后用凉水浸泡一会,口感会更好。<|im_end|>鱼片用沸水氽熟,捞出后用凉水浸泡一会,口感会更好。<|im_end|>鱼片用沸水氽熟,捞出后用凉水浸泡一会,口感会更好。<|im_end|>鱼片用沸水氽熟,捞出后用凉水浸泡一会,口感会更好。<|im_end|>鱼片用沸水氽熟,捞出后用凉水浸泡一会,口感会更好。<|im_end|>鱼片用沸水氽熟,捞出后用凉水浸泡一会,口感会更好。<|im_end|>鱼片用沸水氽熟,捞出后用凉水浸泡一会,口感会更好。<|im_end|>鱼片用沸水氽熟,捞出后用凉水浸泡一会,口感会更好。<|im_end|>']
  • LoRA 微调
['菜? 豆泥豆腐这道菜鲜香诱人,润滑爽口,需要准备的食材有:豆腐·200克\n鸡蛋·1个\n香葱·1棵\n生姜·1小块\n淀粉·适量,调料有:食用油·30克\n香油·1小匙\n酱油·1小匙\n高汤·2大匙\n料酒·1小匙\n胡椒粉·1小匙\n精盐·1小匙\n白糖·小匙\n味精·小匙,具体做法如下:1.将豆腐切成厚片,用开水焯熟,切成方块;葱、姜洗净切末;\n2.将鸡蛋打入碗内,加入精盐、味精、胡椒粉、高汤、淀粉、香油、料酒、葱、姜拌匀成蛋糊;\n3.锅内放油,烧热,下入豆腐块,炸成金黄色后捞起沥油;\n4.锅内留底油,下入葱、姜、酱油、白糖、味精、高汤、蛋糊,用小火烧至汤汁收浓,再用水淀粉勾芡,淋上香油,出锅即可。,最后再给你点小建议:炸豆腐时油温不要过高,以免豆腐炸焦。烹饪时要保持豆腐的形状,以免炸成“花边豆腐”。<|im_start|>']

从结果来看,对于这个简单任务而言,LoRA 微调的效果并不比全参微调差,且更经济高效。

当然这里为了演示,我们只训练了默认的 3 个 epoch,V 100 训练时长大概 1.2 小时。

总结

至此,我们共同走完了完整的 LLM 指令微调任务,从基于 ErnieBot 的数据生成,到基于 PaddleNLP 的 SFT 微调和 LoRA 微调。希望对你开发更多有意思的 LLM 应用有所帮助~

本系列将继续分享采用飞桨深度学习框架服务产业应用的更多案例。如果对你有帮助,欢迎点赞收藏备用~

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

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

相关文章

win10配置pytorch环境+CUDA安装

步骤 1&#xff1a;更新显卡驱动 参考&#xff1a;如何在windows上 安装&更新 显卡的驱动_显卡驱动series和notebook-CSDN博客 进入英伟达官网&#xff1a;下载 NVIDIA 官方驱动 | NVIDIA 根据GPU类型选择对应的NVIDIA驱动&#xff0c;选好后点击“查找” 选择下载 GeFo…

记录|C#中panel与panel重叠显示问题

目录 前言一、问题在现二、方案解决三、效果展示更新时间 前言 参考文章&#xff1a; C#中winform中panel重叠无法显示问题的解决 一、问题在现 问题是我实现上图中效果&#xff0c;但是panel和panel的交界处放入其他组件后&#xff0c;会被部分覆盖【如下图示】 二、方案解决…

在线互动学习网站设计

TOC springboot249在线互动学习网站设计 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0c;规范…

音频矩阵主要功能及常规路数配置有哪些

音频矩阵&#xff0c;又称AUDIO矩阵或音频矩阵切换器&#xff0c;是一种用于管理和控制多个音频信号的设备。它具备多种功能&#xff0c;主要可以概括为以下几个方面&#xff1a; 一、主要功能 信号切换&#xff1a; AUDIO128128音频矩阵能够将多个音频源的信号输入到设备中&…

汽车EDI:法雷奥Valeo EDI项目案例

Valeo是一家总部位于法国的汽车零部件供应商。它专注于设计、生产、和销售各种创新产品和系统&#xff0c;以提高汽车的能效和减少排放。其业务主要分为舒适与驾驶辅助系统、动力总成系统、热系统以及可视系统。 本文将从业务的角度出发&#xff0c;带领大家了解供应商H公司在对…

投资中国硬科技,沙特钱多人不傻

"不止是商业的游戏" 作者 | 田 甜 编辑 | 卢旭成 “中东热”有可能热过了头。 在中东淘金者口中&#xff0c;流传着这样一句话&#xff1a;世界看中东&#xff0c;中东看沙特。过去一年里&#xff0c;中国的GP与创业者们组团赴沙特&#xff0c;目的无非两个——…

C语言 【自定义类型——结构体】(详细)

目录 1、结构体的定义 2、创建与初始化结构体变量 2.0 举例 2.1 结构体的特殊声明 2.1.0 匿名结构体 2.1.1 结构体的自引用 3、结构体内存对齐 3.0 为什么要内存对齐 3.1 对齐规则 3.2 如何修改默认对齐数 4、结构体传参 5、结构体中的位段使用 5.0 什么是位段&…

printf、fprintf、sprintf的使用和区别

printf、fprintf、sprintf的使用和区别 1、sprintf 函数 sprintf函数用于将格式化的数据写入字符串&#xff0c;其原型为&#xff1a; #include <stdio.h>/* *描述&#xff1a;将格式化的数据写入字符串 * *参数&#xff1a; * [out] str&#xff1a; 输出缓冲区…

Python聊天机器人-NoneBot2入门(2024新版)

1. NoneBot2 安装与使用 NoneBot2 是一个现代、跨平台、可扩展的 Python 聊天机器人框架&#xff08;下称 NoneBot&#xff09;&#xff0c;它基于 Python 的类型注解和异步优先特性&#xff08;兼容同步&#xff09;&#xff0c;能够为你的需求实现提供便捷灵活的支持。同时&…

煤炭检测实验室信息管理系统LIMS

在煤矿行业&#xff0c;实验室作为质量控制与技术创新的核心部门&#xff0c;其管理效率与数据准确性直接关系到企业的生产安全与经济效益。随着信息技术的飞速发展&#xff0c;实验室信息管理系统(LIMS)在煤矿行业的应用日益广泛&#xff0c;成为提升实验室管理水平、优化检测…

【动态规划,dp】P1044[NOIP2003 普及组] 栈 题解

题意 给定一个 n ( 1 ≤ n ≤ 18 ) n(1 \leq n \leq 18) n(1≤n≤18)&#xff0c;表示一个操作数序列&#xff0c; 1 , 2 , … , n 1,2,…,n 1,2,…,n&#xff08;图示为 1 到 3 的情况&#xff09;&#xff0c;栈 A 的深度大于 n n n。 现在可以进行两种操作&#xff0c; …

如何选出高品质 SD 存储卡 —— 具备高耐用度且防水防震抗冲击

SD卡&#xff08;Secure Digital Memory Card&#xff09;是一种广泛使用的存储器件&#xff0c;因其快速的数据传输速度、可热插拔的特性以及较大的存储容量&#xff0c;广泛应用于各种场景&#xff0c;例如在便携式设备如智能手机、平板电脑、运动相机等&#xff0c;用于存储…

录屏为什么录制不进去,没有声音?屏幕录制中的声音问题及解决方案

在数字时代&#xff0c;屏幕录制已成为我们日常工作和生活中不可或缺的一部分。无论是制作教学视频、记录在线课程&#xff0c;还是捕捉游戏精彩瞬间&#xff0c;一个好的屏幕录制软件都能让我们的工作更加高效&#xff0c;生活更加丰富。然而&#xff0c;许多用户在使用屏幕录…

谈一谈数据虚拟化的技术核心和应用架构

数据虚拟化&#xff08;Data Virtualization&#xff09;是对数据资源的抽象&#xff0c;通过屏蔽数据资源的存储位置和访问方式&#xff0c;能够将不同数据源、不同格式的数据资源&#xff0c;进行逻辑上的整合集成。这一技术方案与过去面对传统数仓的弊端&#xff0c;业界过去…

为什么说凤凰雪球期权是震荡市场中的稳健选择?

在当前股市波动的背景下&#xff0c;投资者会发现传统的投资策略难以适应市场的快速变化。在这样的环境下&#xff0c;一些创新的金融产品&#xff0c;如凤凰雪球&#xff0c;因其相对较高的安全性和潜在的收益性&#xff0c;逐渐受到市场的关注。 近期&#xff0c;股市呈现出…

大语言模型的简易可扩展增量预训练策略

前言 原论文&#xff1a;Simple and Scalable Strategies to Continually Pre-train Large Language Models翻译文件已整理至Github项目Some-Paper-CN&#xff0c;欢迎大家Star&#xff01; 摘要 大语言模型&#xff08;LLMs&#xff09;通常需要在数十亿个tokens上进行预训…

存储实验:华为异构存储在线接管与在线数据迁移(Smart Virtualization Smart Migration 特性)

目录 目的实验环境实验步骤参考文档1. 主机安装存储多路径2. v2存储创建Lun&#xff0c;映射给主机&#xff1b;主机分区格式化&#xff0c;写数据3. 将v2存储映射该成映射到v3存储上(v3存储和v2之间链路搭建&#xff0c;测通&#xff0c;远端设备&#xff09;&#xff08;Smar…

【深度学习】DDPM公式详解(第一期)

原论文&#xff1a;Denoising Diffusion Probabilistic Models (1)-1 p θ ( x 0 : T ) : p ( x T ) ∏ t 1 T p θ ( x t − 1 ∣ x t ) p_{\theta}(x_0:T) : p(x_T) \prod_{t1}^{T} p_{\theta}(x_{t-1} \mid x_t) pθ​(x0​:T):p(xT​)t1∏T​pθ​(xt−1​∣xt​) 这个…

AI预测福彩3D采取888=3策略+和值012路或胆码测试8月16日新模型预测第58弹

经过近60期的测试&#xff0c;当然有很多彩友也一直在观察我每天发的预测结果&#xff0c;得到了一个非常有价值的信息&#xff0c;那就是9码定位的命中率非常高&#xff0c;57期一共只错了5次&#xff0c;这给喜欢打私房菜的朋友提供了极高价值的预测结果~当然了&#xff0c;大…

IoTSharp:基于 .NET 6.0 的开源物联网平台

目录 前言 项目介绍 为什么会有 IoTSharp&#xff1f; IoTSharp 能做什么&#xff1f; IoTSharp 的亮点 项目技术 1、编程语言 2、系统框架 3、数据库支持 4、消息队列与 EventBus 5、EventBus 存储 项目使用 1、下载 2、启动 3、注册服务 4、初始化influxdb 5…