当前位置: 首页 > news >正文

《生成式 AI》课程 作业6 大语言模型(LLM)的训练微调 Fine Tuning -- part1

资料来自李宏毅老师《生成式 AI》课程,如有侵权请通知下线

Introduction to Generative AI 2024 Spring

该文档主要介绍了国立台湾大学(NTU)2024 年春季 “生成式人工智能(GenAI)” 课程的作业 5(GenAI HW5)相关内容,包括任务概述、待办事项、解码参数、提交与评分、参考资料和附录等部分,具体如下:

  1. 任务概述
    • 目标:让 AI 模型学会根据给定的前两句续写唐诗。
    • 示例:展示了 AI 模型能续写和不能续写唐诗的示例。
    • 方法:通过收集诗歌数据,教导 AI 模型续写唐诗。
    • 生成多样性:同一个前两句,模型可能生成不同的诗歌。
  2. 待办事项(TODOs)
    • 确定用于微调自有大语言模型(LLM)的训练数据数量。
    • 调整解码参数以生成 15 首唐诗。
  3. 模型与数据集
    • 数据集:唐诗数据集,共 5000 首唐诗,示例代码中使用了其中 1040 首进行微调,鼓励尝试使用更多数据以提升性能。
    • 模型:示例代码使用 Taide - 7B 模型(将于 4 月中旬发布,在此之前请勿向课程外人员分享),也可选择其他大语言模型进行微调。
  4. 解码参数调整
    • 生成原理:语言模型生成文本是通过从下一个词元(token)分布中采样来确定下一个词元。
    • 常用参数
      • 温度(temperature):与输出的多样性相关,取值范围为 0.0 及以上,温度越高多样性越好。
      • Top - k:决定模型在生成每个词时的选择数量,是一个正整数,值越大选择范围越广。
      • Top - p:考虑概率累计达到一定阈值(0.0 到 1.0 之间)的词元进行采样,用于控制生成回复的多样性。
      • max_length:生成的词元序列的最大长度,若生成的句子被截断,可检查此参数。
    • 示例代码中的默认参数及调整建议:示例代码中给出了一些解码参数的默认值,并鼓励根据需要调整这些参数以生成更高质量的唐诗。
  5. 作业流程及示例代码
    • 详细介绍了在 Google Colab 中运行的示例代码,包括导入必要的库、设置随机种子、定义函数、加载模型和数据集、设置微调参数、进行微调以及生成诗歌等步骤,并说明了每个步骤的作用和注意事项,以及部分代码块的预计运行时间。
  6. 附录
    • 如何激活 GPU:在训练模型前需激活 GPU,以加速训练过程,介绍了在 Google Colab 中激活 GPU 的步骤(点击 “Runtime” 或 “执行阶段”,选择 “Change runtime type” 或 “变更执行阶段类型”,选择 “T4 GPU” 或其他可用 GPU 并保存)。
    • 选择适配器(adapter):可在训练的不同阶段选择 LoRA 适配器,并观察模型输出的变化,示例代码中选择了最后步骤的适配器。
    • 友好提醒:本次作业是课程中首次训练模型的尝试,过程中可能会遇到问题,但这些经历有助于学生面对未来更大的挑战。
  7. 其他参考资料
    • 提供了相关论文 [2106.09685] LoRA: Low - Rank Adaptation of Large Language Models 的引用,以及 Taide 模型和联发科模型的相关信息。

根据作业的规范要求,这是TA 助教提供的代码连接 需要魔法 google 账号 colab 账号执行

GenAI_hw5_LLM_finetuning.ipynbicon-default.png?t=O83Ahttps://colab.research.google.com/drive/1nB3jwRJVKXSDDNO-pbURrao0N2MpqHl8?usp=sharing#scrollTo=ZVVG_SQrvFpe

以下是google colab的代码, 亲测可执行

想在本地执行代码的可以查看我的另一个博文

《生成式 AI》课程 作业6 大语言模型(LLM)的训练微调 Fine Tuning -- part2-CSDN博客文章浏览阅读147次。代码围绕一个主工作目录展开,在这个主工作目录下包含了多个子目录和相关文件,用于存放不同阶段的数据、模型以及输出结果等内容,各个部分分工明确,以支持整个预训练语言模型微调及测试的流程。这段 Python 代码主要实现了基于 Hugging Face Transformers 库对预训练语言模型(具体为模型)进行微调(Fine-tuning)的功能,使其能更好地应用于生成唐诗相关内容的任务。整个流程涵盖了数据加载与预处理、模型配置、模型训练以及训练后模型的测试与结果保存等环节。https://blog.csdn.net/chenchihwen/article/details/144000079?spm=1001.2014.3001.5501

以下是对这段 Python 代码的逐行解释:

  1. 环境设置与依赖安装
    • from google.colab import drive:导入 Google Colab 的驱动模块,用于挂载 Google Drive。
    • drive.mount('/content/drive'):挂载 Google Drive 到指定目录/content/drive
    • 以下部分是安装所需的包:
      • !pip install bitsandbytes==0.43.0等:使用pip命令安装一系列包,包括bitsandbytesdatasetstransformers等,并指定了版本。
  2. 数据相关操作
    • 数据准备
      • load_datasetload_from_disk:用于加载数据集,这里在后续代码中用于加载训练数据和进行数据处理。
      • !git clone https://github.com/CheeEn-Yu/GenAI-Hw5.git:从指定的 GitHub 仓库克隆数据集到当前目录。
    • 数据处理函数定义
      • generate_training_data函数:用于将数据点(包含指令、输入和输出文本)转换为模型可读取的令牌形式,包括输入令牌、注意力掩码和输出目标。
      • evaluate函数:用于根据输入的指令、生成配置和最大长度,获取模型的输出,并进行解码和打印。
  3. 模型相关操作
    • 模型选择与下载
      • model_name = "/content/TAIDE-LX-7B-Chat"等:指定要使用的语言模型名称,这里默认是TAIDE-LX-7B-Chat模型,也可以选择MediaTek-Research/Breeze-7B-Instruct-v0_1模型。
      • !wget -O taide_7b.zip "https://www.dropbox.com/scl/fi/harnetdwx2ttq1xt94rin/TAIDE-LX-7B-Chat.zip?rlkey=yzyf5nxztw6farpwyyildx5s3&st=s22mz5ao&dl=0"!unzip taide_7b.zip:通过wget命令下载模型的压缩包,并解压到当前目录。
    • 模型推理前设置
      • 配置模型和令牌器:包括设置缓存目录、量化配置、日志级别等,并创建tokenizer,设置pad_tokeneos_token
      • 设置推理参数:如max_lengeneration_config等,用于控制模型的生成行为。
      • 通过示例数据进行推理:使用demo_tang_list中的唐诗句子进行推理,并将结果存储在demo_before_finetune列表中,最后打印和保存到文本文件。
    • 微调参数设置
      • 一系列参数的定义和设置,包括训练数据量、输出目录、检查点目录、训练轮数、学习率等。这些参数可以根据需要进行调整,以控制模型的训练过程和性能。
      • 还包括一些与训练过程相关的设置,如缓存目录、是否从检查点加载模型权重、数据加载路径、训练日志输出步骤、模型保存步骤和限制等。
    • 模型微调
      • 准备工作:根据from_ckpt标志决定是否从检查点加载模型权重,并对模型进行准备,以使用 INT8 训练。
      • 配置和训练:使用LoraConfig配置 LORA 模型,设置相关参数,并通过Transformers Trainer进行模型训练。训练过程中可以设置各种参数,如批次大小、梯度累积步数、学习率等,并禁用模型的缓存功能。
      • 训练结果保存:训练完成后,将模型保存到指定的目录中,并打印可能的缺失权重警告信息。
  4. 测试与结果处理
    • 模型加载与测试设置
      • 查找和列出可用的检查点,并根据用户选择的id_of_ckpt_to_use确定要使用的检查点。
      • 设置测试相关的参数,如max_lentemperaturetop_p等,并从指定的检查点加载模型权重。
    • 测试过程
      • 读取测试数据,对每个测试数据进行预测,并将结果保存到results.txt文件中,同时打印每个预测的结果。
  5. 结果提交与比较
    • 提交要求:强调需要将results.txt文件中的 15 首诗提交到达芬奇助手进行评分。
    • 效果对比:使用与微调前相同的示例数据,对微调后的模型进行推理,并与微调前的结果进行对比,以观察模型在经过微调后的性能提升情况。
  6. 文件下载与参考资料
    • files.download(output_path):从 Google Drive 下载指定路径的文件output_path
    • [Tang Poem Dataset](https://github.com/chinese-poetry/chinese-poetry/tree/master/%E5%85%A8%E5%94%90%E8%AF%97?fbclid=IwAR2bM14S42T-VtrvMi3wywCqKfYJraBtMl7QVTo0qyPMjX9jj9Vj3JepFBA):提供了数据集的参考链接。
from google.colab import drive
drive.mount('/content/drive')"""## Install Packages
We install and import some well-written packages created by others to facilitate the fine-tuning process.The following code block takes about **5** minutes to run, but it may vary depending on the condition of Colab.
"""""" It is recommmended NOT to change codes in this cell """!pip install bitsandbytes==0.43.0
!pip install datasets==2.10.1
!pip install transformers==4.38.2
!pip install peft==0.9.0
!pip install sentencepiece==0.1.99
!pip install -U accelerate==0.28.0
!pip install colorama==0.4.6
!pip install fsspec==2023.9.2"""The following code block takes about **20** seconds to run, but it may vary depending on the condition of Colab."""""" It is recommmended NOT to change codes in this cell """import os
import sys
import argparse
import json
import warnings
import logging
warnings.filterwarnings("ignore")import torch
import torch.nn as nn
import bitsandbytes as bnb
from datasets import load_dataset, load_from_disk
import transformers, datasets
from peft import PeftModel
from colorama import *from tqdm import tqdm
from transformers import AutoTokenizer, AutoConfig, AutoModelForCausalLM, BitsAndBytesConfig
from transformers import GenerationConfig
from peft import (prepare_model_for_int8_training,LoraConfig,get_peft_model,get_peft_model_state_dict,prepare_model_for_kbit_training
)"""## Download Dataset for Fine-tuning"""""" It is recommmended NOT to change codes in this cell """# Download Training dataset
# reference:https://github.com/chinese-poetry/chinese-poetry/tree/master/%E5%85%A8%E5%94%90%E8%AF%97?fbclid=IwAR2bM14S42T-VtrvMi3wywCqKfYJraBtMl7QVTo0qyPMjX9jj9Vj3JepFBA
!git clone https://github.com/CheeEn-Yu/GenAI-Hw5.git"""## Fix Random Seeds
There may be some randomness involved in the fine-tuning process. We fix random seeds to make the result reproducible.
"""""" It is recommmended NOT to change codes in this cell """seed = 42
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False
torch.manual_seed(seed)
if torch.cuda.is_available():torch.cuda.manual_seed_all(seed)"""## Define Some Useful Functions"""""" It is recommmended NOT to change codes in this cell """# 生成訓練資料
def generate_training_data(data_point):"""(1) Goal:- This function is used to transform a data point (input and output texts) to tokens that our model can read(2) Arguments:- data_point: dict, with field "instruction", "input", and "output" which are all str(3) Returns:- a dict with model's input tokens, attention mask that make our model causal, and corresponding output targets(3) Example:- If you construct a dict, data_point_1, with field "instruction", "input", and "output" which are all str, you can use the function like this:formulate_article(data_point_1)"""# construct full input promptprompt = f"""\
[INST] <<SYS>>
You are a helpful assistant and good at writing Tang poem. 你是一個樂於助人的助手且擅長寫唐詩。
<</SYS>>{data_point["instruction"]}
{data_point["input"]}
[/INST]"""# count the number of input tokenslen_user_prompt_tokens = (len(tokenizer(prompt,truncation=True,max_length=CUTOFF_LEN + 1,padding="max_length",)["input_ids"]) - 1)# transform input prompt into tokensfull_tokens = tokenizer(prompt + " " + data_point["output"] + "</s>",truncation=True,max_length=CUTOFF_LEN + 1,padding="max_length",)["input_ids"][:-1]return {"input_ids": full_tokens,"labels": [-100] * len_user_prompt_tokens+ full_tokens[len_user_prompt_tokens:],"attention_mask": [1] * (len(full_tokens)),}# 進行生成回覆的評估
def evaluate(instruction, generation_config, max_len, input="", verbose=True):"""(1) Goal:- This function is used to get the model's output given input strings(2) Arguments:- instruction: str, description of what you want model to do- generation_config: transformers.GenerationConfig object, to specify decoding parameters relating to model inference- max_len: int, max length of model's output- input: str, input string the model needs to solve the instruction, default is "" (no input)- verbose: bool, whether to print the mode's output, default is True(3) Returns:- output: str, the mode's response according to the instruction and the input(3) Example:- If you the instruction is "ABC" and the input is "DEF" and you want model to give an answer under 128 tokens, you can use the function like this:evaluate(instruction="ABC", generation_config=generation_config, max_len=128, input="DEF")"""# construct full input promptprompt = f"""\
[INST] <<SYS>>
You are a helpful assistant and good at writing Tang poem. 你是一個樂於助人的助手且擅長寫唐詩。
<</SYS>>{instruction}
{input}
[/INST]"""# 將提示文本轉換為模型所需的數字表示形式inputs = tokenizer(prompt, return_tensors="pt")input_ids = inputs["input_ids"].cuda()# 使用模型進行生成回覆generation_output = model.generate(input_ids=input_ids,generation_config=generation_config,return_dict_in_generate=True,output_scores=True,max_new_tokens=max_len,)# 將生成的回覆解碼並印出for s in generation_output.sequences:output = tokenizer.decode(s)output = output.split("[/INST]")[1].replace("</s>", "").replace("<s>", "").replace("Assistant:", "").replace("Assistant", "").strip()if (verbose):print(output)return output"""## Download model and inference before fine-tuningThe following code block takes about **10** minutes to run if you use the default setting, but it may vary depending on the condition of Colab.
"""""" You may want (but not necessarily need) to change the LLM model """model_name = "/content/TAIDE-LX-7B-Chat"                            # 設定想要用來進行fine-tune的模型,預設是使用TAIDE 7B的模型
#model_name = "MediaTek-Research/Breeze-7B-Instruct-v0_1"   # 若想選擇使用MediaTek Breeze 7B的模型,可以將這行最前面的 "#" 刪除,並把底下 "!" 開頭的兩行刪除# If you want to use the TAIDE model, you should check out the TAIDE L Models Community License Agreement (https://drive.google.com/file/d/1FcUZjbUH6jr4xoCyAronN_slLgcdhEUd/view) first.
# Once you use it, it means you agree to the terms of the agreement.
!wget -O taide_7b.zip "https://www.dropbox.com/scl/fi/harnetdwx2ttq1xt94rin/TAIDE-LX-7B-Chat.zip?rlkey=yzyf5nxztw6farpwyyildx5s3&st=s22mz5ao&dl=0"!unzip taide_7b.zip"""## Inference before Fine-tuning
Let's first see what our model can do without fine-tuning.The following code block takes about **2** minutes to run if you use the default setting, but it may vary depending on the condition of Colab.
"""""" It is recommmended NOT to change codes in this cell """cache_dir = "./cache"nf4_config = BitsAndBytesConfig(load_in_4bit=True,bnb_4bit_quant_type="nf4",bnb_4bit_use_double_quant=True,bnb_4bit_compute_dtype=torch.bfloat16
)# 從指定的模型名稱或路徑載入預訓練的語言模型
model = AutoModelForCausalLM.from_pretrained(model_name,cache_dir=cache_dir,quantization_config=nf4_config,low_cpu_mem_usage = True
)# 創建 tokenizer 並設定結束符號 (eos_token)
logging.getLogger('transformers').setLevel(logging.ERROR)
tokenizer = AutoTokenizer.from_pretrained(model_name,add_eos_token=True,cache_dir=cache_dir,quantization_config=nf4_config
)
tokenizer.pad_token = tokenizer.eos_token# 設定模型推理時需要用到的decoding parameters
max_len = 128
generation_config = GenerationConfig(do_sample=True,temperature=0.1,num_beams=1,top_p=0.3,no_repeat_ngram_size=3,pad_token_id=2,
)"""The following code block takes about **1** minutes to run if you use the default setting, but it may vary depending on the condition of Colab."""""" It is recommmended NOT to change codes in this cell """# demo examples
test_tang_list = ['相見時難別亦難,東風無力百花殘。', '重帷深下莫愁堂,臥後清宵細細長。', '芳辰追逸趣,禁苑信多奇。']# get the model output for each examples
demo_before_finetune = []
for tang in test_tang_list:demo_before_finetune.append(f'模型輸入:\n以下是一首唐詩的第一句話,請用你的知識判斷並完成整首詩。{tang}\n\n模型輸出:\n'+evaluate('以下是一首唐詩的第一句話,請用你的知識判斷並完成整首詩。', generation_config, max_len, tang, verbose = False))# print and store the output to text file
for idx in range(len(demo_before_finetune)):print(f"Example {idx + 1}:")print(demo_before_finetune[idx])print("-" * 80)"""## Set Hyperarameters for Fine-tuning"""""" It is highly recommended you try to play around this hyperparameter """num_train_data = 1040 # 設定用來訓練的資料數量,可設置的最大值為5000。在大部分情況下會希望訓練資料盡量越多越好,這會讓模型看過更多樣化的詩句,進而提升生成品質,但是也會增加訓練的時間# 使用預設參數(1040): fine-tuning大約需要25分鐘,完整跑完所有cell大約需要50分鐘# 使用最大值(5000): fine-tuning大約需要100分鐘,完整跑完所有cell大約需要120分鐘""" You may want (but not necessarily need) to change some of these hyperparameters """output_dir = "/content/drive/MyDrive"  # 設定作業結果輸出目錄 (如果想要把作業結果存在其他目錄底下可以修改這裡,強烈建議存在預設值的子目錄下,也就是Google Drive裡)
ckpt_dir = "./exp1" # 設定model checkpoint儲存目錄 (如果想要將model checkpoints存在其他目錄下可以修改這裡)
num_epoch = 1  # 設定訓練的總Epoch數 (數字越高,訓練越久,若使用免費版的colab需要注意訓練太久可能會斷線)
LEARNING_RATE = 3e-4  # 設定學習率""" It is recommmended NOT to change codes in this cell """cache_dir = "./cache"  # 設定快取目錄路徑
from_ckpt = False  # 是否從checkpoint載入模型的權重,預設為否
ckpt_name = None  # 從特定checkpoint載入權重時使用的檔案名稱,預設為無
dataset_dir = "./GenAI-Hw5/Tang_training_data.json"  # 設定資料集的目錄或檔案路徑
logging_steps = 20  # 定義訓練過程中每隔多少步驟輸出一次訓練誌
save_steps = 65  # 定義訓練過程中每隔多少步驟保存一次模型
save_total_limit = 3  # 控制最多保留幾個模型checkpoint
report_to = None  # 設定上報實驗指標的目標,預設為無
MICRO_BATCH_SIZE = 4  # 定義微批次的大小
BATCH_SIZE = 16  # 定義一個批次的大小
GRADIENT_ACCUMULATION_STEPS = BATCH_SIZE // MICRO_BATCH_SIZE  # 計算每個微批次累積的梯度步數
CUTOFF_LEN = 256  # 設定文本截斷的最大長度
LORA_R = 8  # 設定LORA(Layer-wise Random Attention)的R值
LORA_ALPHA = 16  # 設定LORA的Alpha值
LORA_DROPOUT = 0.05  # 設定LORA的Dropout率
VAL_SET_SIZE = 0  # 設定驗證集的大小,預設為無
TARGET_MODULES = ["q_proj", "up_proj", "o_proj", "k_proj", "down_proj", "gate_proj", "v_proj"] # 設定目標模組,這些模組的權重將被保存為checkpoint
device_map = "auto"  # 設定設備映射,預設為"auto"
world_size = int(os.environ.get("WORLD_SIZE", 1))  # 獲取環境變數"WORLD_SIZE"的值,若未設定則預設為1
ddp = world_size != 1  # 根據world_size判斷是否使用分散式數據處理(DDP),若world_size為1則不使用DDP
if ddp:device_map = {"": int(os.environ.get("LOCAL_RANK") or 0)}GRADIENT_ACCUMULATION_STEPS = GRADIENT_ACCUMULATION_STEPS // world_size"""## Start Fine-tuningThe following code block takes about **25** minutes to run if you use the default setting, but it may vary depending on the condition of Colab.
"""""" It is recommmended NOT to change codes in this cell """# create the output directory you specify
os.makedirs(output_dir, exist_ok = True)
os.makedirs(ckpt_dir, exist_ok = True)# 根據 from_ckpt 標誌,從 checkpoint 載入模型權重
if from_ckpt:model = PeftModel.from_pretrained(model, ckpt_name)# 將模型準備好以使用 INT8 訓練
model = prepare_model_for_int8_training(model)# 使用 LoraConfig 配置 LORA 模型
config = LoraConfig(r=LORA_R,lora_alpha=LORA_ALPHA,target_modules=TARGET_MODULES,lora_dropout=LORA_DROPOUT,bias="none",task_type="CAUSAL_LM",
)
model = get_peft_model(model, config)# 將 tokenizer 的 padding token 設定為 0
tokenizer.pad_token_id = 0# 載入並處理訓練數據
with open(dataset_dir, "r", encoding = "utf-8") as f:data_json = json.load(f)
with open("tmp_dataset.json", "w", encoding = "utf-8") as f:json.dump(data_json[:num_train_data], f, indent = 2, ensure_ascii = False)data = load_dataset('json', data_files="tmp_dataset.json", download_mode="force_redownload")# 將訓練數據分為訓練集和驗證集(若 VAL_SET_SIZE 大於 0)
if VAL_SET_SIZE > 0:train_val = data["train"].train_test_split(test_size=VAL_SET_SIZE, shuffle=True, seed=42)train_data = train_val["train"].shuffle().map(generate_training_data)val_data = train_val["test"].shuffle().map(generate_training_data)
else:train_data = data['train'].shuffle().map(generate_training_data)val_data = None# 使用 Transformers Trainer 進行模型訓練
trainer = transformers.Trainer(model=model,train_dataset=train_data,eval_dataset=val_data,args=transformers.TrainingArguments(per_device_train_batch_size=MICRO_BATCH_SIZE,gradient_accumulation_steps=GRADIENT_ACCUMULATION_STEPS,warmup_steps=50,num_train_epochs=num_epoch,learning_rate=LEARNING_RATE,fp16=True,  # 使用混合精度訓練logging_steps=logging_steps,save_strategy="steps",save_steps=save_steps,output_dir=ckpt_dir,save_total_limit=save_total_limit,ddp_find_unused_parameters=False if ddp else None,  # 是否使用 DDP,控制梯度更新策略report_to=report_to,),data_collator=transformers.DataCollatorForLanguageModeling(tokenizer, mlm=False),
)# 禁用模型的 cache 功能
model.config.use_cache = False# 若使用 PyTorch 2.0 版本以上且非 Windows 系統,進行模型編譯
if torch.__version__ >= "2" and sys.platform != 'win32':model = torch.compile(model)# 開始模型訓練
trainer.train()# 將訓練完的模型保存到指定的目錄中
model.save_pretrained(ckpt_dir)# 印出訓練過程中可能的缺失權重的警告信息
print("\n If there's a warning about missing keys above, please disregard :)")"""##  Testing
The fine-tuning process is done. We then want to test whether our model can do the task that we wanted it to do before but failed.We need to first load the fine-tuned model for checkpoint we saved.
"""""" It is recommmended NOT to change codes in this cell """# find all available checkpoints
ckpts = []
for ckpt in os.listdir(ckpt_dir):if (ckpt.startswith("checkpoint-")):ckpts.append(ckpt)# list all the checkpoints
ckpts = sorted(ckpts, key = lambda ckpt: int(ckpt.split("-")[-1]))
print("all available checkpoints:")
print(" id: checkpoint name")
for (i, ckpt) in enumerate(ckpts):print(f"{i:>3}: {ckpt}")""" You may want (but not necessarily need) to change the check point """id_of_ckpt_to_use = -1  # 要用來進行推理的checkpoint的id(對應上一個cell的輸出結果)# 預設值-1指的是上列checkpoints中的"倒數"第一個,也就是最後一個checkpoint# 如果想要選擇其他checkpoint,可以把-1改成有列出的checkpoint id中的其中一個ckpt_name = os.path.join(ckpt_dir, ckpts[id_of_ckpt_to_use])""" You may want (but not necessarily need) to change decoding parameters """
# 你可以在這裡調整decoding parameter,decoding parameter的詳細解釋請見homework slides
max_len = 128   # 生成回復的最大長度
temperature = 0.1  # 設定生成回覆的隨機度,值越小生成的回覆越穩定
top_p = 0.3  # Top-p (nucleus) 抽樣的機率閾值,用於控制生成回覆的多樣性
# top_k = 5 # 調整Top-k值,以增加生成回覆的多樣性和避免生成重複的詞彙"""The following code block takes about **2** minutes to run if you use the default setting, but it may vary depending on the condition of Colab."""""" It is recommmended NOT to change codes in this cell """test_data_path = "GenAI-Hw5/Tang_testing_data.json"
output_path = os.path.join(output_dir, "results.txt")cache_dir = "./cache"  # 設定快取目錄路徑
seed = 42  # 設定隨機種子,用於重現結果
no_repeat_ngram_size = 3  # 設定禁止重複 Ngram 的大小,用於避免生成重複片段nf4_config = BitsAndBytesConfig(load_in_4bit=True,bnb_4bit_quant_type="nf4",bnb_4bit_use_double_quant=True,bnb_4bit_compute_dtype=torch.bfloat16
)# 使用 tokenizer 將模型名稱轉換成模型可讀的數字表示形式
tokenizer = AutoTokenizer.from_pretrained(model_name,cache_dir=cache_dir,quantization_config=nf4_config
)# 從預訓練模型載入模型並設定為 8 位整數 (INT8) 模型
model = AutoModelForCausalLM.from_pretrained(model_name,quantization_config=nf4_config,device_map={'': 0},  # 設定使用的設備,此處指定為 GPU 0cache_dir=cache_dir
)# 從指定的 checkpoint 載入模型權重
model = PeftModel.from_pretrained(model, ckpt_name, device_map={'': 0})"""The following code block takes about **4** minutes to run if you use the default setting, but it may vary depending on the condition of Colab."""""" It is recommmended NOT to change codes in this cell """results = []# 設定生成配置,包括隨機度、束搜索等相關參數
generation_config = GenerationConfig(do_sample=True,temperature=temperature,num_beams=1,top_p=top_p,# top_k=top_k,no_repeat_ngram_size=no_repeat_ngram_size,pad_token_id=2
)# 讀取測試資料
with open(test_data_path, "r", encoding = "utf-8") as f:test_datas = json.load(f)# 對於每個測試資料進行預測,並存下結果
with open(output_path, "w", encoding = "utf-8") as f:for (i, test_data) in enumerate(test_datas):predict = evaluate(test_data["instruction"], generation_config, max_len, test_data["input"], verbose = False)f.write(f"{i+1}. "+test_data["input"]+predict+"\n")print(f"{i+1}. "+test_data["input"]+predict)"""## **IMPORTANT**: Submit above 15 poems to DaVinci Assistant.
You can find these poems in your "results.txt". The grading of this homework will be based on the evaluation results of DaVinci Assistant on these poems.## See how the fine-tune model do compared to model without fine-tuningWe now check what our model can do on the same examples we saw in the "Inference before Fine-tuning" section above.The following code block takes about **40** seconds to run if you use the default setting, but it may vary depending on the condition of Colab.
"""# using the same demo examples as before
test_tang_list = ['相見時難別亦難,東風無力百花殘。', '重帷深下莫愁堂,臥後清宵細細長。', '芳辰追逸趣,禁苑信多奇。']# inference our fine-tuned model
demo_after_finetune = []
for tang in test_tang_list:demo_after_finetune.append(f'模型輸入:\n以下是一首唐詩的第一句話,請用你的知識判斷並完成整首詩。{tang}\n\n模型輸出:\n'+evaluate('以下是一首唐詩的第一句話,請用你的知識判斷並完成整首詩。', generation_config, max_len, tang, verbose = False))# print and store the output to text file
for idx in range(len(demo_after_finetune)):print(f"Example {idx + 1}:")print(demo_after_finetune[idx])print("-" * 80)"""## **IMPORTANT**: DO NOT submit the above 3 examples to DaVinci Assistant.
This 3 examples are only used for comparing how model peforms before and after fine-tuning## Download Results
You MUST have this file to finish your homework. If your browser does not download it automatically, you can find it in your Google Drive.
"""from google.colab import files
files.download(output_path)"""## Reference[Tang Poem Dataset](https://github.com/chinese-poetry/chinese-poetry/tree/master/%E5%85%A8%E5%94%90%E8%AF%97?fbclid=IwAR2bM14S42T-VtrvMi3wywCqKfYJraBtMl7QVTo0qyPMjX9jj9Vj3JepFBA)
"""

这是我用这代码在Colab T4 执行的结果

 1 {'loss': 3.336, 'grad_norm': 2.30328106880188, 'learning_rate': 0.00011999999999999999, 'epoch': 0.31}

 2 {'loss': 1.9994, 'grad_norm': 1.6669790744781494, 'learning_rate': 0.00023999999999999998, 'epoch': 0.62}

 3 {'loss': 1.9997, 'grad_norm': 1.8000717163085938, 'learning_rate': 9.999999999999999e-05, 'epoch': 0.92}

 4 {'train_runtime': 5351.2028, 'train_samples_per_second': 0.194, 'train_steps_per_second': 0.012, 'train_loss': 2.4060784559983475, 'epoch': 1.0}

 5 

 6  If there's a warning about missing keys above, please disregard :)

 7 all available checkpoints:

 8  id: checkpoint name

 9   0: checkpoint-65

10 Example 1:

11 模型輸入:

12 以下是一首唐詩的第一句話,請用你的知識判斷並完成整首詩。相見時難別亦難,東風無力百花殘。

13 

14 模型輸出:

15 ] 誰言春來花自落,落花落得誰家。

16 --------------------------------------------------------------------------------

17 Example 2:

18 模型輸入:

19 以下是一首唐詩的第一句話,請用你的知識判斷並完成整首詩。重帷深下莫愁堂,臥後清宵細細長。

20 

21 模型輸出:

22 ] 玉牀金床無夢眠,玉筯金牖無事看。

23 --------------------------------------------------------------------------------

24 Example 3:

25 模型輸入:

26 以下是一首唐詩的第一句話,請用你的知識判斷並完成整首詩。芳辰追逸趣,禁苑信多奇。

27 

28 模型輸出:

29 

30 --------------------------------------------------------------------------------

31 all available checkpoints:

32  id: checkpoint name

33   0: checkpoint-65

34 1. 雪霽銀妝素,桔高映瓊枝。玉關春色深,金谷花氣濃。

35 2. 夫子何爲者?栖栖一代中。今朝不復見,誰言無道人。

36 3. 飛蓋去芳園,蘭橈遊翠渚。春草初生時,春鳥初鳴聲。

37 4. 條風開獻節,灰律動初陽。春草新綠草,春花新紅花。

38 5. 昨夜星辰昨夜風,畫樓西畔桂堂東。今朝春色今朝酒,誰道花落酒醉中。

39 6. 三日入廚下,洗手作羹湯。一朝出戶去,空留空房落。

40 7. 嵩雲秦樹久離居,雙鯉迢迢一紙書。玉關玉門玉關路,金谷金谷玉谷秋。

41 8. 慨然撫長劒,濟世豈邀名。今朝行軍去,誰言無功名。

42 9. 乘興南遊不戒嚴,九重誰省諫書函。玉門春色滿天開,金谷春草遍地春。

43 10. 猿鳥猶疑畏簡書,風雲常爲護儲胥。玉關無事空自閉,金谷無事還自開。

44 11. 君問歸期未有期,巴山夜雨漲秋池。月落青天空無雲,秋風秋草秋草色。

45 12. 相見時難別亦難,東風無力百花殘。今朝春色如故舊,誰言年華已半盡。

46 13. 雲母屏風燭影深,長河漸落曉星沈。玉樓秋風起,金樓秋雨落。

47 14. 高閣客竟去,小園花亂飛。春來無復見,秋來無容歸。

48 15. 瑤池阿母綺窗開,黃竹歌聲動地哀。玉女舞衣金釵落,玉馬飛雪銀輪開。

49 Example 1:

50 模型輸入:

51 以下是一首唐詩的第一句話,請用你的知識判斷並完成整首詩。相見時難別亦難,東風無力百花殘。

52 

53 模型輸出:

54 春去秋來年復年,誰言離別無來時。

55 --------------------------------------------------------------------------------

56 Example 2:

57 模型輸入:

58 以下是一首唐詩的第一句話,請用你的知識判斷並完成整首詩。重帷深下莫愁堂,臥後清宵細細長。

59 

60 模型輸出:

61 玉牀金床無夢眠,玉筯金筶無事看。

62 --------------------------------------------------------------------------------

63 Example 3:

64 模型輸入:

65 以下是一首唐詩的第一句話,請用你的知識判斷並完成整首詩。芳辰追逸趣,禁苑信多奇。

66 

67 模型輸出:

68 春草初生時,花木始開期。

69 --------------------------------------------------------------------------------

70 Example 1:

71 模型輸入:

72 以下是一首唐詩的第一句話,請用你的知識判斷並完成整首詩。相見時難別亦難,東風無力百花殘。

73 

74 模型輸出:

75 春去秋來年復年,誰言離別無來時。

76 --------------------------------------------------------------------------------

77 Example 2:

78 模型輸入:

79 以下是一首唐詩的第一句話,請用你的知識判斷並完成整首詩。重帷深下莫愁堂,臥後清宵細細長。

80 

81 模型輸出:

82 玉牀金床無夢眠,玉筯金筶無事看。

83 --------------------------------------------------------------------------------

84 Example 3:

85 模型輸入:

86 以下是一首唐詩的第一句話,請用你的知識判斷並完成整首詩。芳辰追逸趣,禁苑信多奇。

87 

88 模型輸出:

89 春草初生時,花木始開期。

90 --------------------------------------------------------------------------------

91 Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount("/content/drive", force_remount=True).

92 Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount("/content/drive", force_remount=True).

93 /content/drive/MyDrive/Takeout

94 /content/drive/MyDrive/Colab Notebooks

相关文章:

《生成式 AI》课程 作业6 大语言模型(LLM)的训练微调 Fine Tuning -- part1

资料来自李宏毅老师《生成式 AI》课程&#xff0c;如有侵权请通知下线 Introduction to Generative AI 2024 Spring 该文档主要介绍了国立台湾大学&#xff08;NTU&#xff09;2024 年春季 “生成式人工智能&#xff08;GenAI&#xff09;” 课程的作业 5&#xff08;GenAI HW…...

SQLynx让数据库变得简单!

SQLynx让数据库管理和开发变得更简单&#xff0c;SQLynx是一款旨在简化飞客使用体验的创新型工具&#xff0c;它为数据库管理者、数据库分析师和开发人员提供了一个直观、易用、高效的平台&#xff0c;首先&#xff0c;SQLynx拥有直观友好的用户界面。无论您是新建还是导表&…...

#Uniapp篇:变量v-if 和 v-show 区别.sync 修饰符宽屏适配指南Pinia内置了

let that this 如果在某些methods中this被指向了其他内容&#xff0c;则需要提前把this赋值给另一个变量&#xff0c;比如let that this。 <script>export default {data() {return {connectedWifi:""}},methods: {buttonClick: function () {const that …...

EMD-KPCA-Transformer多变量回归预测!分解+降维+预测!多重创新!直接写核心!

EMD-KPCA-Transformer多变量回归预测&#xff01;分解降维预测&#xff01;多重创新&#xff01;直接写核心&#xff01; 目录 EMD-KPCA-Transformer多变量回归预测&#xff01;分解降维预测&#xff01;多重创新&#xff01;直接写核心&#xff01;效果一览基本介绍程序设计参…...

【数据结构】二叉树(2)

目录 1. 二叉树的遍历 前序遍历 中序遍历 后序遍历 2. 计算二叉树中的节点个数 3. 计算二叉树中叶子节点个数 4. 计算二叉树的深度 5. 计算二叉树第k层节点个数 6. 二叉树基础练习 7. 二叉树的创建 8. 二叉树的销毁 9. 层序遍历 10. 判断二叉树是否为完全二叉树 1…...

常用服务器运维软件之 WGCLOUD(国产)介绍

WGCLOUD是一款免费开源的运维监控软件&#xff0c;轻量高效&#xff0c;部署方便&#xff0c;上手简单&#xff0c;界面简单流畅 WGCLOUD是国产运维软件&#xff0c;可以适配大部分的信创环境&#xff0c;比如麒麟、统信等操作系统 WGCLOUD具体支持监控的操作系统如下&#x…...

shell

第四章 shell中的变量 4.1 系统变量 1.常用系统变量 $HOME ,$PWD,$SHELL ,$USER 4.2 自定义变量 1.变量值&#xff08;等号两边没有空格&#xff09; 2.撤销变量&#xff1a;unset变量 3.声明静态变量&#xff1a;readonly 变量&#xff0c;注意&#xff1a;不能unset 4.变…...

Target-absent Human Attention

Abstract 预测人类注视行为对于构建能够预测用户注意力的人机交互系统非常重要。已经开发出计算机视觉模型来预测人们在搜索目标物体时的注视点。但当目标不存在于图像中时,又该如何处理呢?同样重要的是要了解当人们找不到目标时,他们如何进行搜索,以及何时停止搜索。在本文…...

Objective-C 1.0和2.0有什么区别?

Objective-C ObjC比较小众&#xff0c;在1980年左右由Stepstone公司的Brad Cox和Tom Love发明。后来NeXT公司获得ObjC语言使用权&#xff0c;再后来到1996年NeXT被苹果公司收购也变成苹果公司使用&#xff0c;Mac市场占有率本身就不高&#xff0c;ObjC没有太多程序员。在移动互…...

06 —— Webpack优化—压缩过程

css代码提取后想要压缩 —— 使用css-minimizer-webpack-plugin插件 下载 css-minimizer-webpack-plugin 本地软件包 npm install css-minimizer-webpack-plugin --save-dev 配置 webpack.config.js 让webpack拥有该功能 const CssMinimizerPlugin require(css-minimizer-…...

【探寻密码的奥秘】-000:密码相关概念定义及介绍(持续更新~~)

密码相关概念 1、密码学 1、密码学 密码学是研究密码与密码活动本质和规律&#xff0c;以及指导密码实践的科学&#xff0c;主要探索密码编码和密码分析的一般规律&#xff0c;它是一门结合数学、计算机科学、信息通信系统等多门学科为一体的综合性学科。 密码学的常见应用场景…...

大模型(LLMs)推理篇

大模型&#xff08;LLMs&#xff09;推理篇 1. 为什么大模型推理时显存涨的那么多还一直占着&#xff1f; 首先&#xff0c;序列太长了&#xff0c;有很多Q/K/V&#xff1b;其次&#xff0c;因为是逐个预测next token&#xff0c;每次要缓存K/V加速解码。 大模型在gpu和cpu上…...

算法学习笔记(十):位运算、数论等

一.位运算基础 集合与集合之间的位运算 集合和元素 常用函数 1.使两个整数相等的位更改次数 给你两个正帧数 n 和 k&#xff0c;你可以选择 n 的二进制表示 中任意一个值为 1 的位&#xff0c; 并将其改为0&#xff0c;返回使得 n 等于 k 所需要的更改次数&#xff0c;如无法实…...

深度学习:神经网络中线性层的使用

深度学习&#xff1a;神经网络中线性层的使用 在神经网络中&#xff0c;线性层&#xff08;也称为全连接层或密集层&#xff09;是基础组件之一&#xff0c;用于执行输入数据的线性变换。通过这种变换&#xff0c;线性层可以重新组合输入数据的特征&#xff0c;并将其映射到新…...

Robot | 用 RDK 做一个小型机器人(更新中)

目录 前言架构图开发过程摄像头模型转换准备校准数据使用 hb_mapper makertbin 工具转换模型 底版开发 结语 前言 最近想开发一个小型机器人&#xff0c;碰巧看到了 RDK x5 发布了&#xff0c;参数对于我来说非常合适&#xff0c;就买了一块回来玩。 外设也是非常丰富&#xf…...

数据结构与算法——1120——时间空间效率问题求边界值

目录 1、效率问题 1、时间复杂度 1、O(1) 2、O(n) 3、O(n) 或O(n*log2n)——n倍的log以2为底n的对数 例题 4、O(n) 2、空间复杂度 3、数组和链表 2、面试题之求边界值 题目 解答 &#xff08;1&#xff09;-i &#xff08;2&#xff09;~i &#xff08;3&#x…...

HTML通过JavaScript获取访问连接,IP和端口

<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title>Get IP Address</title> <script> function displayURL() { var url window.location.href; // 获取当…...

TCP vs UDP:如何选择适合的网络传输协议?

在网络通信中&#xff0c;TCP&#xff08;Transmission Control Protocol&#xff09;和UDP&#xff08;User Datagram Protocol&#xff09;是两种非常重要的传输层协议。它们各有特点&#xff0c;适用于不同类型的应用场景。本文将详细探讨TCP和UDP协议的结构、优缺点及应用&…...

学习QT第二天

QT6示例运行 运行一个Widgets程序运行一个QT Quick示例 工作太忙了&#xff0c;难得抽空学点东西。-_-||| 博客中有错误的地方&#xff0c;请各位道友及时指正&#xff0c;感谢&#xff01; 运行一个Widgets程序 在QT Creator的欢迎界面中&#xff0c;点击左侧的示例&#xf…...

递归算法专题一>Pow(x, n)

题目&#xff1a; 解析&#xff1a; 代码&#xff1a; public double myPow(double x, int n) {return n < 0 ? 1.0 / pow(x,-n) : pow(x,n); }private double pow(double x, int n){if(n 0) return 1.0;double tmp pow(x,n / 2);return n % 2 0 ? tmp * tmp : tmp …...

利用Python爬虫获取商品评论:技术与实践

在当今这个信息爆炸的时代&#xff0c;互联网上充斥着海量的数据。对于电商平台来说&#xff0c;用户评论是了解消费者喜好、优化产品策略的重要依据。Python作为一种强大的编程语言&#xff0c;其丰富的库支持使得爬虫技术成为获取这些数据的有效手段。本文将详细介绍如何使用…...

python之使用django框架开发web项目

本问将对django框架在python的web项目中的使用进行介绍,有不对之处,烦请指正。 首先使用创建一个django工程(本示例中使用pycharm2024+python3.12),名称和项目保存路径根据自己的需要自行修改,新手直接默认本机环境就好(关于conda将会另开一篇进行讲解。),最后点击cre…...

当产业经济插上“数字羽翼”,魔珐有言AIGC“3D视频创作大赛”成功举办

随着AI技术的飞速发展&#xff0c;3D数字人技术已成为驱动各行各业转型升级的重要力量。在这一背景下&#xff0c;2024山东3D数字人视频创作大赛应运而生&#xff0c;并在一番激烈的角逐后圆满落幕&#xff0c;为科技与创意的交融写下浓墨重彩的一笔。 11月20日&#xff0c;一…...

设计模式之策略模式

背景&#xff1a;导入功能需要做成根据编码code或者名称实现不同的导入逻辑&#xff0c;编码和名称都是可配置的&#xff0c;未知的变化&#xff0c;这里要写通用的导入、校验和具体的导入、校验。至此我想到采用设计模式之策略模式工厂模式实现此需求。若有不妥还望指正。 自…...

/etc/sudoers 文件格式解读

文章目录 例如 /etc/sudoers 文件中存在这样一行&#xff1a; ubuntu ALL(ALL:ALL) NOPASSWD: ALL 解释如下&#xff1a; 1. 第一个表示用户名&#xff0c;这意味着此行规则适用于名为 ubuntu 的用户。 2. 接下来等号左边的 ALL 表示允许从任何主机登录当前的用户账户&#xf…...

Linux虚拟机网络配置

Linux固定IP 跳转到 cd /etc/sysconfig/network-scripts/ 打开文件并编辑 vim ifcfg-ens33 增加或修改选中内容 重启网卡 systemctl restart network ifconfig -a 查看ip已固定 虚拟机网络编辑器调整 子网IP进行修改&#xff0c;例如本机IP修改为10.212.197.34 此处就修改…...

C++模版特化和偏特化

什么是模版特化 特化的含义&#xff1a;所谓特化&#xff0c;就是将泛型搞得具体化一些&#xff0c;从字面上来解释&#xff0c;就是为已有的模板参数进行一些使其特殊化的指定&#xff0c;使得以前不受任何约束的模板参数&#xff0c;或受到特定的修饰&#xff08;例如const或…...

17. 指针类型和步长概念问题

1. 项目场景&#xff1a; ➣ Jack Qiao对米粒说&#xff1a;“今天有道友遇到一个问题&#xff0c;举个栗子数组 arr[5] { 0 };道友发现&arr[0] 1与&arr 1打印出来的地址竟然不同。”米粒测试后果然是这样。 2. 问题描述 ☑ 举个栗子&#xff1a;数组 arr[5] { 0…...

如何自动下载和更新冰狐智能辅助?

冰狐智能辅助的版本更新非常快&#xff0c;如果设备多的话每次手工更新会非常麻烦&#xff0c;现在分享一种免费的自动下载和安装冰狐智能辅助的方法。 一、安装迅雷浏览器 安装迅雷浏览器1.19.0.4280版本&#xff0c;浏览器用于打开冰狐的官网&#xff0c;以便于从官网下载a…...

C# 数据结构之【队列】C#队列

1. 描述 队列&#xff1a;队列遵循先进先出&#xff08;FIFO&#xff09;原则&#xff0c;在一端进行插入操作&#xff0c;在另一端进行删除操作。 2. 应用示例 using System;namespace DataStructure {class Program{static async Task Main(string[] args){// 创建一个队列…...

Java-05 深入浅出 MyBatis - 配置深入 动态 SQL 参数、循环、片段

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 大数据篇正在更新&#xff01;https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了&#xff1a; MyBatis&#xff…...

HTML+CSS网页模板,左侧导航,右侧内容,顶部LOGO

网页顶部是网站名称和LOGO&#xff0c;左侧是菜单导航&#xff0c;点击菜单&#xff0c;右侧显示内容。HTMLCSS代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport"…...

Redis的基本使用命令(GET,SET,KEYS,EXISTS,DEL,EXPIRE,TTL,TYPE)

目录 SET GET KEYS EXISTS DEL EXPIRE TTL redis中的过期策略是怎么实现的&#xff08;面试&#xff09; 上文介绍reids的安装以及基本概念&#xff0c;本章节主要介绍 Redis的基本使用命令的使用 Redis 是一个基于键值对&#xff08;KEY - VALUE&#xff09;存储的…...

Spring AOP

目录 1.AOP概述 2.Spring AOP快速实现 3.Spring AOP核⼼概念 ​编辑 3.1切点(Pointcut) 3.2连接点(Join Point) 3.3通知(Advice) 3.4切⾯(Aspect) 4.通知类型 5.PointCut 6.切⾯优先级 Order 7.annotation 1.AOP概述 &#xff08;1&#xff09;什么是AOP&#xf…...

SIMD AVX2 向量计算

_mm256_fmadd_ps: 能够在单个操作中执行乘法和加法&#xff0c;从而提高浮点计算的精度和性能。_mm256_sub_ps : Intel Advanced Vector Extensions (AVX) 指令集中用于从两个 AVX 寄存器中逐元素进行单精度浮点数减法的内联函数。这个函数允许同时对 8 个单精度浮点数进行减法…...

clipboard

clipboard 现代复制到剪贴板。无闪光。只有 3kb 的 gzip 压缩。 安装 npm install clipboard --save第三方cdn提供商 <script src"https://cdn.jsdelivr.net/npm/clipboard2.0.11/dist/clipboard.min.js"></script>使用 data-clipboard-target"…...

【JavaEE进阶】 JavaScript

本节⽬标 了解什么是JavaScript, 学习JavaScript的常⻅操作, 以及使⽤JQuery完成简单的⻚⾯元素操作. 一. 初识 JavaScript 1.JavaScript 是什么 JavaScript (简称 JS), 是⼀个脚本语⾔, 解释型或即时编译型的编程语⾔. 虽然它是作为开发Web⻚⾯的脚本语⾔⽽出名&#xff0c;…...

python程序的编写以及发布(形象类比)

最近重新接触python&#xff0c;本人之前对于python的虚拟环境&#xff0c;安装包比较比较迷惑&#xff0c;这里给出一个具象的理解。可以将 Python 程序运行的过程类比成一次 做菜的过程&#xff0c;从准备食材到最后出锅。以下是具体的类比步骤&#xff1a; 1. 安装 Python 环…...

游戏引擎学习第20天

视频参考:https://www.bilibili.com/video/BV1VkBCYmExt 解释 off-by-one 错误 从演讲者的视角&#xff1a;对代码问题的剖析与修复过程 问题的起因 演讲者提到&#xff0c;他可能无意中在代码中造成了一个错误&#xff0c;这与“调试时间标记索引”有关。他发现了一个逻辑问题…...

大数据面试题每日练习--HDFS是如何工作的?

HDFS&#xff08;Hadoop Distributed File System&#xff09;是一个分布式文件系统&#xff0c;设计用于存储非常大的文件。它的主要工作原理如下&#xff1a; NameNode&#xff1a;管理文件系统的命名空间&#xff0c;维护文件目录树和文件元数据信息。NameNode记录每个文件…...

高质量 JavaScript

高质量的 JavaScript 非常重要。它能够提升代码的可读性&#xff0c;让其他开发者可以轻松理解代码意图&#xff0c;减少沟通成本和维护难度。同时&#xff0c;合理的代码结构和正确的语法运用能够避免许多潜在的错误和性能问题&#xff0c;例如通过正确处理异步操作来防止程序…...

小白投资理财 - 解读威廉分形指标 Williams Fractals

小白投资理财 - 解读威廉分形指标 Williams Fractals WF 指标WF 的使用止损支撑和阻力 WF 缺点WF 组合使用WF EMAWF 和趋势线 WF 周期设定总结 你有看过这种情况吗&#xff1f;它能够准确的让你知道高点和低点&#xff0c;而且每次都能够完美的预测到反转的信号&#xff0c;其…...

五天SpringCloud计划——DAY2之使用Docker完成项目的部署

一、引言 刚刚学完了Docker的使用&#xff0c;现在知识在脑子里面还是热乎的&#xff0c;是时候把它总结一下了。 现在的我认为Docker时一个部署项目的工具(不知道是不是真的),相比于我以前使用宝塔面板部署项目&#xff0c;使用Docker更能让我看到代码之美&#xff0c;怎么一…...

HarmonyOS4+NEXT星河版入门与项目实战(11)------Button组件

文章目录 1、控件图解2、案例实现1、代码实现2、代码解释3、运行效果4、总结1、控件图解 这里我们用一张完整的图来汇整 Button 的用法格式、属性和事件,如下所示: 按钮默认类型就是胶囊类型。 2、案例实现 这里我们实现一个根据放大和缩小按钮来改变图片大小的功能。 功…...

oracle的静态注册和动态注册

oracle的静态注册和动态注册 静态注册&#xff1a; 静态注册 : 指将实例的相关信息手动告知 listener 侦 听 器 &#xff0c; 可以使用netmgr,netca,oem 以及直接 vi listener.ora 文件来实现静态注册&#xff0c;在动态注册不稳定时使用&#xff0c;特点是&#xff1a;稳定&…...

【系统架构设计师】真题论文: 论软件可靠性设计技术的应用(包括解题思路和素材)

更多内容请见: 备考系统架构设计师-专栏介绍和目录 文章目录 真题题目(2013年 试题3)解题思路论文素材参考软件可靠性设计技术概念主要的软件可靠性设计技术软件可靠性设计技术的应用流程真题题目(2013年 试题3) 随着软件的日益普及,系统中软件成分不断增加,使得系统对…...

网络运输层之(1)TCP连接管理

网络运输层之(1)TCP连接管理 Author: Once Day Date: 2024年10月22日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可参考专栏: 通信网络技术_Once-Day的博客…...

基于阿里云服务器部署静态的website

目录 一&#xff1a;创建服务器实例并connect 二&#xff1a;本地文件和服务器share 三&#xff1a;关于IIS服务器的安装预配置 四&#xff1a;设置安全组 五&#xff1a;建站流程 六&#xff1a;关于备案 一&#xff1a;创建服务器实例并connect 创建好的服务器实例在云…...

Git项目管理

Git项目管理 分区概念&#xff1a;创建本地仓库查看当前仓库的状态工作区添加到暂存区暂存区恢复到工作区工作区提交到本地仓库查看提交日志版本回滚查看版本变更的所有记录分支查看分支创建分支删除分支切换分支合并分支 冲突解决HEAD指针分支使用的一般规范masterdevelopfeat…...

实践指南:EdgeOne与HAI的梦幻联动

在当今快速发展的数字时代&#xff0c;安全和速度已成为网络服务的基石。EdgeOne&#xff0c;作为腾讯云提供的边缘安全加速平台&#xff0c;以其全球部署的节点和强大的安全防护功能&#xff0c;为用户提供了稳定而高效的网络体验。而HAI&#xff08;HyperApplicationInventor…...