初学者如何微调大模型?从0到1详解

news2025/6/3 11:02:10

本文将手把手带你从0到1,详细解析初学者如何微调大模型,让你也能驾驭这些强大的AI工具。


1. 什么是大模型微调?

想象一下,预训练大模型就像一位博览群书但缺乏专业知识的通才。它掌握了海量的通用知识,但可能无法完美胜任特定领域的细分任务。

微调(Fine-tuning) 就是在这个“通才”的基础上,喂给它特定领域或任务的小批量高质量数据,让它在保持原有通用能力的同时,成为特定领域的“专家”。这就像给一位全科医生进行专科培训,让他成为心脏病专家一样。

与从头训练(Pre-training from scratch)相比,微调的优势:

  • 数据需求少: 不需要海量的无标签数据。
  • 计算资源消耗低: 对GPU的要求相对较低。
  • 训练时间短: 通常几个小时到几天就能完成。
  • 效果显著: 能在特定任务上取得比通用模型更好的表现。

微调 vs. Prompt Engineering vs. RAG:

  • Prompt Engineering: 通过精心设计输入提示(Prompt)来引导模型输出期望结果,不改变模型参数。
  • RAG (Retrieval Augmented Generation): 结合外部知识库,在生成回答时检索相关信息作为上下文,不改变模型参数。
  • Fine-tuning: 通过在特定数据集上继续训练,从而调整模型内部的参数。

对于需要模型学习特定风格、知识或执行特定指令格式的任务,微调往往是更优选。


2. 微调前的准备工作 

在开始微调之前,你需要做好以下准备:

  • 2.1 明确目标与应用场景:

    • 你希望模型解决什么问题?(例如:客服问答、代码生成、特定风格的文本创作、情感分析等)
    • 你的应用场景对模型的哪些能力要求较高?(例如:遵循指令、领域知识、特定输出格式)
    • 干货提示: 目标越清晰,数据准备和模型选择就越有针对性。初期可以从小处着手,验证可行性。
  • 2.2 理论知识储备:

    • Python基础: 掌握Python编程语言。
    • 深度学习基础: 了解神经网络、梯度下降、损失函数等基本概念。
    • NLP基础(可选但推荐): 了解词嵌入、注意力机制等概念会有帮助。
    • 干货提示: 不用精通所有理论,但理解核心概念能帮助你更好地理解微调过程和参数设置。推荐吴恩达的深度学习课程或Hugging Face的NLP课程。
  • 2.3 硬件与环境:

    • GPU: 微调大模型通常需要一块或多块高性能GPU。NVIDIA的GPU(如RTX 30系列、40系列,或A100/H100)是主流选择。
    • 内存: 显存(VRAM)和内存(RAM)都非常重要,显存大小直接决定了你能微调多大的模型和选择多大的批次大小(batch size)。
    • 软件环境:
      • Python (通常 3.8+ )
      • PyTorch 或 TensorFlow/JAX (PyTorch 更为流行)
      • Hugging Face Transformers, Datasets, Accelerate, PEFT 库
      • CUDA 和 cuDNN (如果使用NVIDIA GPU)
    • 干货提示:
      • 对于初学者,可以考虑使用云平台(如Google Colab Pro, AWS SageMaker, Azure ML, 国内的阿里云、腾讯云等)提供的GPU资源,按需付费,免去本地配置的麻烦。
      • 如果没有GPU,可以尝试微调非常小的模型或使用CPU进行少量实验,但效率会很低。

3. 微调实战步骤详解 📝

接下来,我们将分步骤讲解微调大模型的完整流程。

  • 3.1 选择合适的基础模型:

    • 模型规模: 参数量(如7B, 13B, 70B)。模型越大,能力越强,但微调和推理所需的资源也越多。初学者建议从较小规模的模型(如7B)开始。
    • 开源许可: 注意模型的开源协议是否允许你的使用场景(如商业用途)。
    • 社区支持与文档: 选择有活跃社区和完善文档的模型,遇到问题更容易找到解决方案。
    • 预训练语料: 了解模型的预训练数据是否包含与你任务相关的语言或领域。
    • 热门选择:
      • Llama系列 (Meta): Llama 2, Llama 3 (推荐)
      • Qwen系列 (阿里通义千问): Qwen1.5, Qwen2 (对中文支持友好)
      • ChatGLM系列 (智谱AI): ChatGLM3 (对中文支持友好)
      • Mistral/Mixtral (Mistral AI): 高效且性能优异

  • 3.2 数据准备与处理 (关键中的关键!):

    • 数据质量远比数量重要! 低质量、有噪声的数据会严重影响微调效果,甚至产生负面作用。
    • 数据格式:
      • 指令微调 (Instruction Fine-tuning): 通常采用问答对、指令-输出对的形式。常见格式为JSON Lines (JSONL),每行一个JSON对象,包含 promptcompletion,或类似 instruction, input, output 的结构。 JSON

        // 示例1: Alpaca 格式
        {"instruction": "解释什么是机器学习。", "input": "", "output": "机器学习是人工智能的一个分支..."}
        {"instruction": "将以下句子翻译成英文。", "input": "你好,世界!", "output": "Hello, world!"}
        
        // 示例2: Prompt-Completion 格式
        {"prompt": "用户:你好\nAI:", "completion": "你好!有什么可以帮助你的吗?"}
        
      • 继续预训练 (Continued Pre-training): 使用纯文本格式,让模型学习特定领域的知识或风格。
    • 数据来源:
      • 公开数据集: Alpaca, Dolly, OpenOrca等。
      • 业务数据: 从你的实际业务场景中积累的数据 (注意数据隐私和脱敏)。
      • 人工标注: 针对特定任务,人工构建高质量数据。
      • 合成数据: 使用更强大的模型(如GPT-4)生成微调数据 (注意评估生成数据的质量)。
    • 数据清洗与预处理:
      • 去除重复、不相关、低质量的数据。
      • 统一格式,处理特殊字符。
      • 进行Tokenization (分词),将文本转换为模型可以理解的ID序列。Hugging Face的 tokenizer 会帮你做这件事。
    • 划分数据集: 将数据划分为训练集(Training Set)和验证集(Validation Set,有时也需要测试集 Test Set)。验证集用于在训练过程中监控模型性能,防止过拟合。
    • 干货提示:
      • 数据增强: 对于小数据集,可以考虑同义词替换、回译等方法进行数据增强,但要保证增强后数据的质量。
      • Prompt 设计: 微调数据的Prompt本身也需要精心设计,清晰、明确的指令有助于模型学习。考虑加入系统提示(System Prompt)来设定模型的角色或行为准则。
      • 至少准备几百到几千条高质量的指令数据,对于简单任务,几百条可能就有效;复杂任务则需要更多。
  • 3.3 选择微调策略 (PEFT大法好):

    • 全量微调 (Full Fine-tuning): 更新模型的所有参数。效果可能最好,但对显存需求极大,训练时间长,初学者不推荐。
    • 参数高效微调 (Parameter-Efficient Fine-tuning, PEFT): 只微调模型的一小部分参数或增加少量额外参数。显著降低显存消耗和计算成本。
      • LoRA (Low-Rank Adaptation): 目前最流行的PEFT方法之一。通过在模型的某些层(通常是Attention层)旁边注入可训练的低秩矩阵来适配新任务。微调时只训练这些小矩阵,原始模型参数冻结。
      • QLoRA (Quantized LoRA): LoRA的进一步优化。通过将预训练模型量化到更低精度(如4-bit),并结合LoRA进行微调,能极大降低显存占用,使得在消费级GPU上微调更大模型成为可能。强烈推荐初学者使用!
      • 其他PEFT方法: Prefix Tuning, P-Tuning, Adapters等。
    • 干货提示: Hugging Face的 PEFT 库 (https://huggingface.co/docs/peft) 提供了LoRA、QLoRA等多种PEFT方法的便捷实现。
  • 3.4 配置训练参数 (Hyperparameters):

    • learning_rate (学习率): 控制模型参数更新的幅度。通常较小,如 1e-5, 2e-5, 5e-5。过大会导致训练不稳定,过小则收敛缓慢。
    • batch_size (批次大小): 一次梯度更新所用的样本数。受显存限制,越大通常效果越稳定,但过大会爆显存。QLoRA可以支持更大的有效批次。
    • num_train_epochs (训练轮次): 整个训练数据集被模型学习的次数。通常1-5轮。轮次过多可能导致过拟合。
    • gradient_accumulation_steps (梯度累积步数): 当显存不足以支持较大batch_size时,通过累积多次小批次的梯度,模拟大批次训练效果。实际 batch_size = per_device_train_batch_size * num_gpus * gradient_accumulation_steps
    • optimizer (优化器): 如AdamW。
    • lr_scheduler_type (学习率调度器):cosine, linear,用于在训练过程中动态调整学习率。
    • LoRA特定参数:
      • r (LoRA的秩):通常取8, 16, 32, 64。
      • lora_alpha:LoRA的缩放因子,通常设为 r 的两倍或与 r 相同。
      • target_modules:指定在哪些模块上应用LoRA,如 ["q_proj", "v_proj"]
    • 干货提示:
      • 初学者可以先从社区推荐的默认参数开始尝试。
      • 使用 wandb (Weights & Biases) 或 tensorboard 等工具来追踪和可视化训练过程,便于调参。
      • QLoRA关键配置(使用bitsandbytes库):
        • load_in_4bit=True
        • bnb_4bit_quant_type="nf4" (NF4量化类型)
        • bnb_4bit_use_double_quant=True (二次量化)
        • bnb_4bit_compute_dtype=torch.bfloat16 (计算时使用的类型)
  • 3.5 开始训练!🚂

    • 使用Hugging Face Trainer API 或自定义训练循环。Trainer API 封装了很多细节,对初学者更友好。
    • 关键代码片段(概念性,具体实现依赖库和模型):
      from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments, Trainer, BitsAndBytesConfig
      from peft import get_peft_model, LoraConfig, prepare_model_for_kbit_training
      import torch
      
      # 1. 加载Tokenizer和模型 (以QLoRA为例)
      model_name = "meta-llama/Llama-2-7b-hf" # 替换为你选择的模型
      tokenizer = AutoTokenizer.from_pretrained(model_name)
      if tokenizer.pad_token is None:
          tokenizer.add_special_tokens({'pad_token': '[PAD]'}) # Llama等模型可能需要
      
      quantization_config = BitsAndBytesConfig(
          load_in_4bit=True,
          bnb_4bit_quant_type="nf4",
          bnb_4bit_compute_dtype=torch.bfloat16,
          bnb_4bit_use_double_quant=True,
      )
      model = AutoModelForCausalLM.from_pretrained(
          model_name,
          quantization_config=quantization_config,
          device_map="auto" # 自动分配到可用GPU
      )
      model.gradient_checkpointing_enable() # 进一步节省显存
      model = prepare_model_for_kbit_training(model) # 预处理模型以支持k-bit训练
      
      # 2. 配置LoRA
      lora_config = LoraConfig(
          r=16,
          lora_alpha=32,
          target_modules=["q_proj", "v_proj"], # 示例,具体模块看模型结构
          lora_dropout=0.05,
          bias="none",
          task_type="CAUSAL_LM"
      )
      model = get_peft_model(model, lora_config)
      model.print_trainable_parameters() # 查看可训练参数占比
      
      # 3. 加载和处理数据 (假设你已准备好 tokenized_datasets)
      # tokenized_datasets = ... (使用Hugging Face Datasets库加载和处理)
      
      # 4. 配置训练参数
      training_args = TrainingArguments(
          output_dir="./output_finetuned_model",
          per_device_train_batch_size=1, # 根据显存调整
          gradient_accumulation_steps=4,  # 有效batch_size = 1*4=4
          learning_rate=2e-4, # QLoRA通常用稍大的学习率
          num_train_epochs=1, # 先用1轮试试
          logging_steps=10,
          save_steps=100, # 每100步保存一次checkpoint
          evaluation_strategy="steps", # 如果有验证集
          eval_steps=50,             # 每50步评估一次
          fp16=True, # 如果GPU支持且不是QLoRA(QLoRA内部处理精度)
          # bf16=True, # 如果GPU支持(如A100),通常比fp16更好
      )
      
      # 5. 初始化Trainer并开始训练
      trainer = Trainer(
          model=model,
          args=training_args,
          train_dataset=tokenized_datasets["train"],
          eval_dataset=tokenized_datasets.get("validation"), # 可选
          # data_collator=... # 可能需要DataCollatorForLanguageModeling
      )
      trainer.train()
      
      # 6. 保存模型
      model.save_pretrained("./output_finetuned_lora_adapters")
      # 如果需要合并LoRA权重到基础模型 (可选,会增加显存占用)
      # merged_model = model.merge_and_unload()
      # merged_model.save_pretrained("./output_finetuned_merged_model")
      # tokenizer.save_pretrained("./output_finetuned_merged_model")
      
    • 监控训练过程: 观察Loss曲线是否平稳下降,验证集上的指标是否提升。如果Loss长时间不下降或剧烈震荡,可能需要调整学习率或其他参数。
  • 3.6 评估模型效果 

    • 自动化评估:
      • Perplexity (困惑度): 衡量模型对文本序列的流畅性和可预测性的指标,越低越好。
      • 任务相关指标: 如BLEU (翻译), ROUGE (摘要), Accuracy (分类), F1-score等。
      • Benchmark: 使用标准Benchmark(如MMLU, GSM8K, C-Eval)评估模型在多项能力上的表现(通常用于更全面的模型评估)。
    • 人工评估: 对于生成任务,人工评估往往更可靠。设计评估维度(如指令遵循度、相关性、流畅性、安全性等),让评估者对模型输出进行打分。
    • 对比评估: 将微调后的模型与微调前的基础模型、其他SOTA模型进行对比。
    • 干货提示: 准备一个小的、高质量的、有代表性的“保留测试集”(Holdout Test Set),在训练中完全不使用,仅用于最终评估。
  • 3.7 模型部署与推理 🚀

    • LoRA权重加载: 使用PEFT库加载基础模型,再加载训练好的LoRA权重即可进行推理,非常轻量。 Python

      from peft import PeftModel
      from transformers import AutoModelForCausalLM, AutoTokenizer
      
      base_model_name = "meta-llama/Llama-2-7b-hf"
      lora_adapter_path = "./output_finetuned_lora_adapters"
      
      base_model = AutoModelForCausalLM.from_pretrained(base_model_name, device_map="auto", torch_dtype=torch.bfloat16) # 注意与训练时精度匹配
      tokenizer = AutoTokenizer.from_pretrained(base_model_name)
      
      model_with_lora = PeftModel.from_pretrained(base_model, lora_adapter_path)
      model_with_lora.eval() # 设置为评估模式
      
      # 推理
      prompt = "解释一下什么是黑洞?"
      inputs = tokenizer(prompt, return_tensors="pt").to(model_with_lora.device)
      outputs = model_with_lora.generate(**inputs, max_new_tokens=100)
      print(tokenizer.decode(outputs[0], skip_special_tokens=True))
      
    • 合并权重(可选): 可以将LoRA权重合并到基础模型中,形成一个完整的微调后模型,方便部署。但合并后模型体积会变大。
    • 推理优化:
      • 量化 (Quantization): 如GPTQ, AWQ,进一步压缩模型,加速推理。
      • Flash Attention: 优化Attention计算,提升速度和减少显存。
      • 推理服务框架: vLLM, TGI (Text Generation Inference), TensorRT-LLM 等,提供高性能推理服务。
    • 干货提示: Hugging Face的 pipeline API可以快速搭建推理流程。对于生产环境,建议使用专门的推理服务框架。
  • 3.8 迭代与优化 🔄

    • 微调往往不是一次就能成功的。根据评估结果,你可能需要:
      • 调整数据质量和数量。
      • 尝试不同的基础模型。
      • 调整超参数。
      • 尝试不同的PEFT方法或配置。
    • 这是一个不断实验、分析、改进的循环过程。

4. 微调的常见陷阱与建议 ⚠️

  • 过拟合 (Overfitting): 模型在训练数据上表现很好,但在未见过的数据上表现差。
    • 对策: 使用更多样化的数据、早停(Early Stopping)、正则化(如Dropout,LoRA本身也有一定正则效果)、减少训练轮次、增加验证集监控。
  • 灾难性遗忘 (Catastrophic Forgetting): 模型在学习新知识时忘记了预训练时学到的通用能力。
    • 对策: PEFT方法本身能缓解这个问题。保留一部分通用数据进行混合训练,或使用更高级的技术如EWC。对于大多数特定任务微调,如果数据和任务相关性高,这个问题不突出。
  • 数据泄露 (Data Leakage): 验证集或测试集的信息意外地混入训练集。
    • 对策: 严格划分数据集,确保数据独立。
  • 显存不足 (Out of Memory, OOM):
    • 对策: 使用QLoRA,减小batch_size,启用梯度累积,使用gradient_checkpointing,选择更小的模型,使用多GPU并行(如DeepSpeed ZeRO)。
  • 训练时间过长:
    • 对策: 优化数据加载,使用更高效的硬件,尝试更小的模型或更少的训练数据进行快速实验。
  • “脏数据”毁所有: 再次强调数据质量的重要性!
  • 初始期望过高: 微调不是万能药,它是在现有模型基础上进行优化。如果基础模型本身能力有限,微调效果也会受限。

给初学者的建议:

  1. 先跑通一个最小可行案例 (MVP): 用少量数据、小模型、短时间跑通整个流程,建立信心。
  2. 善用开源社区和工具: Hugging Face, GitHub上有大量现成代码和教程。
  3. 多动手实践: 理论学得再多,不如实际操作一遍。
  4. 记录实验: 详细记录每次实验的配置、数据、结果,便于分析和复现。
  5. 保持耐心: AI模型训练充满不确定性,遇到问题是常态,不断调试和学习。

5. 总结与展望 ✨

恭喜你,已经初步掌握了微调大模型的核心知识和流程!从明确目标到数据准备,从选择模型到参数配置,再到训练、评估和部署,每一步都充满了挑战与乐趣。

大模型技术仍在飞速发展,新的算法、模型和工具层出不穷。保持学习的热情,积极拥抱变化,你将在这个激动人心的AI时代大有可为!

现在,就开始你的第一次大模型微调之旅吧! 💪


相关推荐

  • 2025大模型技术架构揭秘:GPT-4、Gemini、文心等九大模型核心技术对比与实战选型指南-CSDN博客

  • 💡大模型中转API推荐

  • ✨中转使用教程

技术交流:欢迎在评论区共同探讨!更多内容可查看本专栏文章,有用的话记得点赞收藏噜!

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

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

相关文章

西瓜书第十一章——降维与度量学习

文章目录 降维与度量学习k近邻学习原理头歌实战-numpy实现KNNsklearn实现KNN 降维——多维缩放(Multidimensional Scaling, MDS,MDS)提出背景与原理重述1.**提出背景**2.**数学建模与原理推导**3.**关键推导步骤** Principal Component Analy…

Portainer安装指南:多节点监控的docker管理面板-家庭云计算专家

背景 Portainer 是一个轻量级且功能强大的容器管理面板,专为 Docker 和 Kubernetes 环境设计。它通过直观的 Web 界面简化了容器的部署、管理和监控,即使是非技术用户也能轻松上手。Portainer 支持多节点管理,允许用户从一个中央控制台管理多…

vscode实用配置

前端开发安装插件: 1.可以更好看的显示文件图标 2.用户快速打开文件 使用步骤:在html文件下右键点击 open with live server 即可 刷力扣: 安装这个插件 还需要安装node.js即可

React 项目中封装 Excel 导入导出组件:技术分享与实践

文章目录 前言一、为什么需要封装 Excel 组件?二、技术选型三、核心实现1. 安装依赖2. 封装Excel导出3. 封装导入组件 (UploadExcel) 总结 前言 在 React 项目中,处理 Excel 文件的导入和导出是常见的业务需求。无论是导出报表数…

【2025CCF中国开源大会】RISC-V 开源生态的挑战与机遇分论坛重磅来袭!共探开源芯片未来

点击蓝字 关注我们 CCF Opensource Development Committee 开源浪潮正从软件席卷硬件领域,RISC-V作为全球瞩目的开源芯片架构,正在重塑计算生态的版图!相较于成熟的x86与ARM,RISC-V生态虽处爆发初期,却蕴藏着无限可能。…

python完成批量复制Excel文件并根据另一个Excel文件中的名称重命名

import openpyxl import shutil import os # 原始文件路径 original_file "C:/Users/Administrator/Desktop/事业联考面试名单/郑州.xlsx" # 读取包含名称的Excel文件 # 修改为您的文件名 wb openpyxl.load_workbook( "C:/Users/Administrator/Desktop/事…

Vue-2-前端框架Vue基础入门之二

文章目录 1 计算属性1.1 计算属性简介1.2 计算属性示例 2 侦听器2.1 简单的侦听器2.2 深度监听2.3 监听对象单个属性 3 vue-cli3.1 工程化的Vue项目3.2 Vue项目的运行流程 4 vue组件4.1 Vue组件的三个部分4.1.1 template4.1.2 script4.1.3 style 4.2 组件之间的关系4.2.1 使用组…

CPT208 Human-Centric Computing 人机交互 Pt.7 交互和交互界面

文章目录 1. 界面隐喻(Interface metaphors)1.1 界面隐喻的应用方式1.2 界面隐喻的优缺点 2. 交互类型2.1 Instructing(指令式交互)2.2 Conversing(对话式交互)2.3 Manipulating(操作式交互&…

[网页五子棋][匹配模块]前后端交互接口(消息推送机制)、客户端开发(匹配页面、匹配功能)

让多个用户,在游戏大厅中能够进行匹配,系统会把实力相近的两个玩家凑成一桌,进行对战 约定前后端交互接口 消息推送机制 匹配这样的功能,也是依赖消息推送机制的 玩家 1 点击开始匹配按钮,就会告诉服务器&#xff1…

【数据分析】Matplotlib+Pandas+Seaborn绘图

【数据分析】MatplotlibPandasSeaborn绘图 (一)Matplotlib绘图1.1 matplotlib绘图方式1: 状态接口1.2 matplotlib绘图方式2: 面向对象1.3 通过安斯科姆数据集, 说明可视化的重要性1.4 MatPlotlib绘图-单变量-直方图1.5 MatPlotlib绘图-双变量-散点图1.6 …

NLP学习路线图(十五):TF-IDF(词频-逆文档频率)

在自然语言处理(NLP)的浩瀚宇宙中,TF-IDF(词频-逆文档频率) 犹如一颗恒星,虽古老却依然璀璨。当ChatGPT、BERT等大模型光芒四射时,TF-IDF作为传统方法的代表,其简洁性、高效性与可解…

[Redis] Redis命令在Pycharm中的使用

初次学习,如有错误还请指正 目录 String命令 Hash命令 List命令 set命令 SortedSet命令 连接pycharm的过程见:[Redis] 在Linux中安装Redis并连接桌面客户端或Pycharm-CSDN博客 redis命令的使用见:[Redis] Redis命令(1&#xf…

openpnp - 给M4x0.7mm的直油嘴加油的工具选择

文章目录 openpnp - 给M4x0.7mm的直油嘴加油的工具选择概述如果换上带卡口的M4x0.7直油嘴END openpnp - 给M4x0.7mm的直油嘴加油的工具选择 概述 X导轨用了一个HG15的滑块 滑块上的注油口的黄油嘴是M4x0.7mm的直油嘴。 外表面是6边形的柱子,没有可以卡住加油嘴工…

EasyExcel复杂Excel导出

效果图展示 1、引入依赖 <!-- easyExcel --> <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>4.0.2</version> </dependency>2、实体类 import com.alibaba.excel.annotatio…

1,QT的编译教程

目录 整体流程: 1,新建project文件 2,编写源代码 3,打开QT的命令行窗口 4,生成工程文件(QT_demo.pro) 5,生成Make file 6,编译工程 7,运行编译好的可执行文件 整体流程: 1,新建project文件 新建文本文件,后缀改为.cpp 2,编写源代码

【笔记】在 MSYS2(MINGW64)中安装 Python 工具链的记录

#工作记录 &#x1f4cc; 安装背景 操作系统&#xff1a;MSYS2 MINGW64当前时间&#xff1a;2025年6月1日Python 版本&#xff1a;3.12&#xff08;默认通过 pacman 安装&#xff09;目标工具链&#xff1a; pipxnumpypipsetuptoolswheel &#x1f6e0;️ 安装过程与结果记录…

Linux 学习-模拟实现【简易版bash】

1、bash本质 在模拟实现前&#xff0c;先得了解 bash 的本质 bash 也是一个进程&#xff0c;并且是不断运行中的进程 证明&#xff1a;常显示的命令输入提示符就是 bash 不断打印输出的结果 输入指令后&#xff0c;bash 会创建子进程&#xff0c;并进行程序替换 证明&#x…

【中国・珠海】2025 物联网与边缘计算国际研讨会(IoTEC2025)盛大来袭!

2025 物联网与边缘计算国际研讨会&#xff08;IoTEC2025&#xff09;盛大来袭&#xff01; 科技浪潮奔涌向前&#xff0c;物联网与边缘计算已成为驱动各行业变革的核心力量。在此背景下&#xff0c;2025 物联网与边缘计算国际研讨会&#xff08;IoTEC2025&#xff09;即将震撼…

中国高分辨率高质量地面CO数据集(2013-2023)

时间分辨率&#xff1a;日空间分辨率&#xff1a;1km - 10km共享方式&#xff1a;开放获取数据大小&#xff1a;9.83 GB数据时间范围&#xff1a;2013-01-01 — 2023-12-31元数据更新时间&#xff1a;2024-08-19 数据集摘要 ChinaHighCO数据集是中国高分辨率高质量近地表空气污…

GO——内存逃逸分析

一、可能导致逃逸的5中情况 package mainimport "fmt"func main() {f1()f2()f3()f4()f5() }type animal interface {run() }type dog struct{}func (d *dog) run() {fmt.Println("狗在跑") }// 指针、map、切片为返回值的会发生内存逃逸 func f1() (*int,…