Kaggle - LLM Science Exam 大模型做科学选择题

Kaggle - LLM Science Exam

Science Exam Simple Approach w/ Model Hub | Kaggle

Platypus2-70B with Wikipedia RAG | Kaggle

5个选项只有一个选项正确,目标:回答一个选项序列(只有前三个有效)

输出正确选项 (可以多输出几个选项 防止第一选项是错的 要让正确选择尽量靠前)

以下为一个简单版本的直接调用大模型,还有一个复杂版本的 RAG + 分布式运行 70B 超大模型

目录

简单实现版: 设置prompt 直接调用大模型(无训练过程)

1. 数据集&模型导入

2. 组合构建选项问题的提示词

3. 回答第一个问题例子

4. post_process 模型输出修正

5. 输出+提交

一、RAG + 分片并行计算

1. RAG 理论概述

2. RAG 工作流程总结

3. SentenceTransformer 类   文本->向量

4. RAG 检索 整合上下文context帮助LLM

二、有限GPU内存下运行超大模型

1. 四大关键技术

2. 三阶段流程

3. 模型权重分片存储+符号链接虚拟文件系统

4. 权重加载器类 (WeightsLoader)

5. 分片LLAMA模型类 (ShardedLlama) 

6. 将原始数据 tokenizer 转换为模型能理解的 标准化输入

7. 模型运行函数

8. 将之前的函数和类 总流程运行

9. 训练集 结果评估


简单实现版: 设置prompt 直接调用大模型(无训练过程)

Kaggle - LLM Science Exam-simple(直接调用大模型)

1. 数据集&模型导入

选的是 flan-t5 的小模型;适用于做小选择题;

(有个弊端是 只会输出一个选项 但根据题目要求 按正确概率从前到后输出五个选项更好)

import pandas as pdimport warnings
warnings.simplefilter("ignore")import torch
from transformers import T5Tokenizer, T5ForConditionalGenerationllm = '/kaggle/input/flan-t5/pytorch/base/4'
model = T5ForConditionalGeneration.from_pretrained(llm)
tokenizer = T5Tokenizer.from_pretrained(llm)test = pd.read_csv('/kaggle/input/kaggle-llm-science-exam/test.csv', index_col='id')
test.head()

数据格式为 prompt 对应问题;还有五个选项; train 还包含正确答案 answer

2. 组合构建选项问题的提示词

(可以将kaggle的题干发给deepseek 让它生成一个比较准确的prompt )下例为

''' 你是一个善于回答科学选择题的专家。请遵循以下步骤:

1. 仔细分析以下问题和所有选项。

2. 判断每个选项作为答案的正确可能性。

3. 将五个选项字母(A、B、C、D、E)按可能性从高到低排序。

4. 最终只输出排序后的字母序列,字母之间用单个空格分隔,不要输出任何其他文字。

例如,如果你认为B最可能正确,其次是A,然后是D、C、E,你应该输出:B A D C E

现在请回答以下问题:  '''

def format_input(df, idx):preamble = 'You are an expert skilled at answering scientific multiple-choice questions. Please follow these steps:/\nCarefully analyze the following question and all options./\nEvaluate the likelihood of each option being the correct answer./\nRank the five option letters (A, B, C, D, E) in order from most likely to least likely to be correct./\nFinally, output only the sequenced letters in order, separated by single spaces, without any additional text./\nFor example, if you believe option B is most likely correct, followed by A, then D, C, and E, you should output: B A D C E /\nNow please answer the following question:.'# 前面那段话 + 问题和五个选项prompt = df.loc[idx, 'prompt']a = df.loc[idx, 'A']b = df.loc[idx, 'B']c = df.loc[idx, 'C']d = df.loc[idx, 'D']e = df.loc[idx, 'E']input_text = f"{preamble}\n\n{prompt}\n\nA) {a}\nB) {b}\nC) {c}\nD) {d}\nE) {e}"return input_text

3. 回答第一个问题例子

tokenizer input   ->   generate output   ->   decode answer

inputs = tokenizer(format_input(test, 0), return_tensors="pt")
outputs = model.generate(**inputs)
answer = tokenizer.batch_decode(outputs, skip_special_tokens=True)
print(answer)

4. post_process 模型输出修正

凑满五个选项;把少的字母拼在答案的后面

比如只输出 D 就输出 D ABCE

def post_process(predictions):valid = set(['A', 'B', 'C', 'D', 'E'])# 如果模型输出中没有任何有效字母if set(predictions).isdisjoint(valid):final_pred = 'A B C D E' # 返回默认答案else:final_pred = []for prediction in predictions:if prediction in valid: # 只保留有效字母final_pred += prediction# 添加缺失的字母to_add = valid - set(final_pred)final_pred.extend(list(to_add))# 格式化为空格分隔final_pred = ' '.join(final_pred)return final_pred

5. 输出+提交

submission = pd.read_csv('/kaggle/input/kaggle-llm-science-exam/sample_submission.csv', index_col='id')for idx in test.index:inputs = tokenizer(format_input(test, idx), return_tensors="pt")outputs = model.generate(**inputs)answer = tokenizer.batch_decode(outputs, skip_special_tokens=True)submission.loc[idx, 'prediction'] = post_process(answer)display(submission.head())
submission.to_csv('submission.csv')

方案二 运用RAG + 分片并行加载70B超大模型 

Platypus2-70B with Wikipedia RAG | Kaggle

一、RAG + 分片并行计算

1. RAG 理论概述

Retrieval-Augmented Generation (RAG) 是一种结合信息检索和文本生成的混合模型架构,主要包含两个核心组件:

  1. 检索器 (Retriever):从大规模知识库中检索与输入相关的文档或段落

  2. 生成器 (Generator):基于检索到的上下文信息生成高质量的答案

RAG 的优势在于:

  • 能够访问外部知识,减少模型幻觉

  • 不需要重新训练整个模型即可更新知识

  • 提供可追溯的信息来源

2. RAG 工作流程总结

  1. 查询编码:将问题+选项编码为高维向量

  2. 向量检索:在 FAISS 索引中查找相似文档

  3. 上下文构建:整合检索到的相关文档

  4. 准备生成:为后续的 LLM 提供增强的上下文信息

3. SentenceTransformer 类   文本->向量

功能:将文本句子转换为高维向量表示(嵌入向量)embeddings

整体工作流程

  1. 输入:原始文本句子列表

  2. 预处理:添加检索提示前缀 → 分词 → 填充/截断

  3. 编码:通过预训练模型获取句子表示

  4. 后处理:L2归一化 → 转移到CPU → 转换为numpy

  5. 输出:形状为 [num_sentences, embedding_dim] 的嵌入矩阵

1. 初始化 device;checkpoint;model;tokenizer

class SentenceTransformer:def __init__(self, checkpoint, device="cuda:0"):self.device = device  # 设置计算设备(GPU或CPU)self.checkpoint = checkpoint  # 预训练模型的路径或名称self.model = AutoModel.from_pretrained(checkpoint).to(self.device).half()  # 加载模型并转换为半精度self.tokenizer = AutoTokenizer.from_pretrained(checkpoint)  # 加载对应的分词器

2. 分词处理 transform    分词 → 填充/截断

def transform(self, batch):# 对批量文本进行分词处理tokens = self.tokenizer(batch["text"], truncation=True,       # 截断超过最大长度的文本padding=True,          # 填充较短序列以保证批次统一return_tensors="pt",   # 返回PyTorch张量max_length=MAX_SEQ_LEN # 最大序列长度限制(512))return tokens.to(self.device)  # 将张量移动到指定设备

3. 创建数据加载器 get_dataloader     添加前缀 + 取batch_size 加载数据,用在batch循环中

def get_dataloader(self, sentences, batch_size=32):# 添加检索专用的提示前缀sentences = ["Represent this sentence for searching relevant passages: " + x for x in sentences]# 创建Hugging Face数据集对象dataset = Dataset.from_dict({"text": sentences})# 设置实时转换函数dataset.set_transform(self.transform)# 创建PyTorch数据加载器dataloader = DataLoader(dataset, batch_size=batch_size,  # 控制每次处理的样本数量shuffle=False           # 不 shuffle,保持原始顺序)return dataloader

4. 编码 encode    循环batch的数据集 -> 模型输出 -> L2归一化 -> 嵌入矩阵

def encode(self, sentences, show_progress_bar=False, batch_size=32):# 创建数据加载器dataloader = self.get_dataloader(sentences, batch_size=batch_size)# 可选进度条显示pbar = tqdm(dataloader) if show_progress_bar else dataloaderembeddings = []  # 存储所有嵌入向量for batch in pbar: # 循环加载的数据集with torch.no_grad():  # 禁用梯度计算,节省内存# 前向传播获取模型输出e = self.model(**batch).pooler_output# L2归一化,使向量处于单位球面上e = F.normalize(e, p=2, dim=1)# 转移到CPU并转换为numpy数组embeddings.append(e.detach().cpu().numpy())# 合并所有批次的嵌入向量embeddings = np.concatenate(embeddings, axis=0)return embeddings

4. RAG 检索 整合上下文context帮助LLM

  1. 将测试集中的问题编码为向量

  2. 在FAISS向量数据库中搜索最相关的Wikipedia 维基百科 经过预处理和解析的科学相关内容

  3. 提取并整合相关文档作为上下文信息context 为后续的LLM生成阶段提供知识支持

1. 将测试集中的问题编码为向量

加载句子嵌入模型 SentenceTransformer;

构建查询文本:将问题与所有选项拼接,形成更丰富的查询 将测试集中的问题编码为向量

# 加载句子嵌入模型(BGE-small-en-v1.5),用于将文本转换为向量表示
model = SentenceTransformer(MODEL_PATH, device="cuda:0")# 构建查询文本:将问题与所有选项拼接,形成更丰富的查询 得到嵌入embedding
f = lambda row : " ".join([row["prompt"], row["A"], row["B"], row["C"], row["D"], row["E"]])
inputs = df.apply(f, axis=1).values
prompt_embeddings = model.encode(inputs, show_progress_bar=False)

2. 在FAISS向量数据库搜索

实现了大规模向量数据库的高效相似度搜索

从海量知识库中快速检索最相关的文档,为LLM提供准确的上下文信息

# 加载预构建的FAISS向量索引文件
MODEL_PATH = "/kaggle/input/bge-small-faiss/"
faiss_index = faiss.read_index(MODEL_PATH + '/faiss.index')NUM_TITLES=5 # 为每个查询检索最相关的5个文档# 在FAISS索引中执行相似度搜索,查找与每个查询最相关的文档
# [1]返回第二个元素:search()返回(distances, indices)元组,只需要索引位置
search_index = faiss_index.search(np.float32(prompt_embeddings), NUM_TITLES)[1]

3. 搜索最相关的Wikipedia文档 拼接为context 上下文

# 加载预处理好的Wikipedia段落数据集 包含解析和扩展后的科学相关文本内容
dataset = load_from_disk("/kaggle/input/all-paraphs-parsed-expanded")# 遍历测试集中的每个问题,构建对应的上下文
for i in range(len(df)):df.loc[i, "context"] = "-" + "\n-".join([dataset[int(j)]["text"] for j in search_index[i]])# 内存清理
faiss_index.reset()  # 重置FAISS索引,释放内部资源    
del faiss_index, prompt_embeddings, model, dataset # 删除对象引用,加速垃圾回收
clean_memory() # 执行深度内存清理:垃圾回收、C层内存整理、GPU缓存清空

二、有限GPU内存下运行超大模型

在单个T4 GPU(16GB内存)上运行Platypus2-70B模型(约140GB),面临内存容量严重不足的问题。传统方法需要将整个模型加载到GPU内存,但这里采用了创新的分层加载和流水线处理方案。

1. 四大关键技术

1. 模型分片存储与动态加载

  • 分片存储:将70B模型拆分为多个部分存储在磁盘上

  • 按需加载:只在需要时才将特定层加载到GPU内存

  • 符号链接:创建虚拟文件系统,让程序以为模型是完整的

2. 分层处理流水线

  • 逐层处理:不是一次性加载整个模型,而是按层顺序处理

  • 内存复用:处理完一层后立即释放该层内存,加载下一层

  • CPU-GPU协作:在CPU内存中预加载下一层权重,减少等待时间

3. 多GPU并行计算

  • 数据并行:将测试数据分割到多个GPU上同时处理

  • 权重共享:多个GPU共享同一套模型权重,避免重复存储

  • 线程安全:使用同步机制确保权重加载的协调性

4. 内存优化策略

  • 半精度计算:使用float16而非float32,减少50%内存占用

  • 注意力优化:使用Flash Attention减少内存使用

  • 缓存管理:及时清理GPU和CPU内存碎片

2. 三阶段流程

准备阶段

  1. 建立虚拟模型文件系统

  2. 初始化空模型结构(不占用实质内存)

  3. 准备多GPU协调机制

推理阶段(逐样本逐层处理)

  1. 输入处理:将问题+选项+上下文转换为token序列

  2. 分层计算:每层依次 加载权重到GPU + 计算输出 + 释放内存

  3. 结果收集:逐层传递中间结果,最终得到预测分数

后处理阶段

  1. 对每个选项计算置信度分数

  2. 排序得到Top-3预测

  3. 生成提交格式

3. 模型权重分片存储+符号链接虚拟文件系统

  • 分片存储:模型权重被预先分割存储在多个文件中

  • 虚拟整合:通过符号链接创建统一的文件系统视图

权重分别在这三个文件

# 创建符号链接虚拟文件系统checkpoint_path = Path("/root/.cache/")
checkpoint_path.mkdir(exist_ok=True, parents=True)for part in [1, 2, 3]:source_dir = Path(f'/kaggle/input/platypus2-chuhac2-part{part}')for path in source_dir.glob("*"):(checkpoint_path / path.name).symlink_to(path)

4. 权重加载器类 (WeightsLoader)

每次有一部分GPU需要申请参数,给这些GPU分发参数。 

要求:所有设备都请求同一层

class WeightsLoader:def __init__(self, checkpoint_path, devices):self.checkpoint_path = Path(checkpoint_path)self.states = {device: None for device in devices}  # 设备状态跟踪self.state_dict = None  # 当前加载的权重字典self.condition = Condition()  # 线程同步条件变量def get_state_dict(self, device):# 等待权重加载完成,然后获取权重字典with self.condition:while self.states[device] is not None:  # 等待当前加载完成self.condition.wait()result = self.state_dictself.states[device] = Noneif not any(self.states.values()):  # 所有设备都获取完毕self.condition.notify_all()return resultdef set_state_dict(self, layer_name, device):# 请求加载指定层的权重with self.condition:self.states[device] = layer_name  # 标记设备需要该层if all(self.states.values()):  # 所有设备都请求同一层assert len(set(self.states.values())) == 1  # 确保请求一致# 实际加载权重到CPU内存self.state_dict = load_file(self.checkpoint_path / (layer_name + ".safetensors"), device="cpu")for d in self.states:  # 重置所有设备状态self.states[d] = Noneself.condition.notify_all()  # 通知所有等待线程

5. 分片LLAMA模型类 (ShardedLlama) 

实现:分层初始化机制 + 分层加载与执行

1. 架构设计  参数 + 层的顺序

class ShardedLlama:def __init__(self, checkpoint_path, weights_loader, device="cuda:0", dtype=torch.float16):self.checkpoint_path = Path(checkpoint_path)self.weights_loader = weights_loader  # 权重加载器实例self.device = deviceself.dtype = dtype  # 半精度节省内存# 初始化空模型结构(几乎不占内存)self.config = AutoConfig.from_pretrained(self.checkpoint_path)self.tokenizer = AutoTokenizer.from_pretrained(checkpoint_path)self.init_model()  # 创建模型框架# 定义层处理顺序self.layer_names = ["model.embed_tokens"] + [f"model.layers.{i}" for i in range(len(self.model.model.layers))] + ["model.norm", "value_head"]

2. 分层初始化机制

def init_model(self):# 使用空权重初始化模型结构with init_empty_weights():  # 关键:不分配实际内存self.model = AutoModelForCausalLM.from_config(self.config)self.model.lm_head = torch.nn.Linear(8192, 8, bias=False)self.model.eval()self.model = BetterTransformer.transform(self.model)  # 启用Flash Attentionself.model.tie_weights()# 提取层引用以便逐层处理self.layers = [self.model.model.embed_tokens] + list(self.model.model.layers) + [self.model.model.norm, self.model.lm_head]# 只将缓冲区移到设备(占用内存很少)for buffer_name, buffer in self.model.named_buffers():set_module_tensor_to_device(self.model, buffer_name, self.device, value=buffer, dtype=self.dtype)

3. 分层加载与执行

使用线程池实现加载与计算重叠;

预加载下一层 获取权重 + 计算结果(选项顺序)+ 释放空间

def __call__(self, inputs):# 每次调用前清理内存并重新初始化del self.modelclean_memory()self.init_model()# 准备输入数据batch = [(prefix.to(self.device), suffix.to(self.device)) for prefix, suffix in inputs]# 使用线程池实现加载与计算重叠with ThreadPoolExecutor() as executor, torch.inference_mode():# 预加载第一层future = executor.submit(self.load_layer_to_cpu, "model.embed_tokens")# 逐层处理流水线for i, (layer_name, layer) in enumerate(zip(self.layer_names, self.layers)):# 获取当前层权重,并预加载下一层state_dict = future.result()if (i + 1) < len(self.layer_names):future = executor.submit(self.load_layer_to_cpu, self.layer_names[i + 1])# 将权重转移到GPUself.move_layer_to_device(state_dict)# 执行当前层计算for j, (prefix, suffix) in enumerate(batch):if layer_name == "model.embed_tokens":batch[j] = (layer(prefix), layer(suffix))  # 嵌入层elif layer_name == "model.norm":batch[j] = (None, layer(suffix[torch.arange(n_suffixes), suffix_eos[j]][:, None]))  # 归一化elif layer_name == "value_head":batch[j] = layer(suffix)[:, 0].mean(1).detach().cpu().numpy()  # 输出层else:# Transformer层:使用KV缓存优化len_p, len_s = prefix.shape[1], suffix.shape[1]new_prefix, (k_cache, v_cache) = layer(prefix, use_cache=True, attention_mask=attention_mask[:, :, -len_p:, -len_p:])# 使用缓存计算suffixpos = position_ids[:, len_p:len_p + len_s].expand(n_suffixes, -1)attn = attention_mask[:, :, -len_s:, -len_p - len_s:].expand(n_suffixes, -1, -1, -1)kv_cache = (k_cache.expand(n_suffixes, -1, -1, -1), v_cache.expand(n_suffixes, -1, -1, -1))new_suffix = layer(suffix, past_key_value=kv_cache, position_ids=pos, attention_mask=attn)[0]batch[j] = (new_prefix, new_suffix)# 释放当前层内存layer.to("meta")  # 移回元设备(释放GPU内存)clean_memory()  # 强制垃圾回收

6. 将原始数据 tokenizer 转换为模型能理解的 标准化输入

系统提示词 + instruction + 选项 + 问题文本 + 拼接context上下文

def get_tokens(row, tokenizer): # 系统提示词模板,定义任务格式system_prefix = "Below is an instruction that describes a task, paired with an input that provides further context. Write a response that appropriately completes the request.\n\n### Instruction:\n{instruction}\n\n### Input:\nContext:\n{context}"# 具体任务指令,明确模型职责instruction = "Your task is to analyze the question and answer below. If the answer is correct, respond yes, if it is not correct respond no. As a potential aid to your answer, background context from Wikipedia articles is at your disposal, even if they might not always be relevant."# 处理五个选项,生成对应的suffix输入prompt_suffix = [f"{row[letter]}\n\n### Response:\n" for letter in "ABCDE"]suffix = tokenizer(prompt_suffix, return_tensors="pt", return_attention_mask=False, truncation=True, max_length=MAX_LENGTH, padding=True)["input_ids"][:, 1:]# 处理问题文本部分prompt_question = f"\nQuestion: {row['prompt']}\nProposed answer: "question = tokenizer(prompt_question, return_tensors="pt", return_attention_mask=False, truncation=True, max_length=max(0, MAX_LENGTH - suffix.shape[1]))["input_ids"][:, 1:]# 处理上下文信息,整合Wikipedia检索结果prompt_context = system_prefix.format(instruction=instruction, context=row["context"])max_length = min(MAX_CONTEXT, max(0, MAX_LENGTH - question.shape[1] - suffix.shape[1]))context = tokenizer(prompt_context, return_tensors="pt", return_attention_mask=False, truncation=True, max_length=max_length)["input_ids"]# 组合前缀部分(上下文+问题)prefix = torch.cat([context, question], dim=1)return prefix, suffix

7. 模型运行函数

ShardedLlama + input分批次 + 推理得到output

def run_model(device, df, weights_loader):# 初始化分片模型实例model = ShardedLlama(checkpoint_path, weights_loader, device=device)# 创建数据处理函数(部分应用tokenizer)f = partial(get_tokens, tokenizer=model.tokenizer)# 为DataFrame的每一行生成模型输入inputs = df.apply(f, axis=1).values# 将输入数据分割成多个批次batches = np.array_split(inputs, N_BATCHES)outputs = []# 逐批次执行模型推理for i, batch in enumerate(batches):outputs += model(batch)  # 调用模型前向传播return outputs  # 返回所有推理结果

8. 将之前的函数和类 总流程运行

weights_loader权重加载器 + run_model 跑模型

output 为每个选项的概率;按照概率倒序 前三名

# 仅在测试集模式下执行完整推理流程
if IS_TEST_SET:# 检测所有可用的CUDA设备devices = [f"cuda:{i}" for i in range(torch.cuda.device_count())]# 创建权重加载器实例,用于多设备权重协调weights_loader = WeightsLoader(checkpoint_path, devices)# 创建部分应用函数,固定权重加载器参数f = partial(run_model, weights_loader=weights_loader)# 使用线程池执行器进行并行计算with ThreadPoolExecutor() as executor:# 将数据分割并映射到各个设备执行outputs = list(executor.map(f, devices, np.array_split(df, 2)))outputs = sum(outputs, [])  # 扁平化结果列表# 处理模型输出,生成最终预测n = len(df)for i, scores in enumerate(outputs):# 按得分降序排序,获取Top-3选项索引top3 = np.argsort(scores)[::-1]# 将索引转换为选项字母df.loc[i, "prediction"] = " ".join(["ABCDE"[j] for j in top3])# 训练集模式下的性能评估if "answer" in df.columns:# 详细准确率计算 在下一部分中
else:# 非测试集模式生成默认预测df["prediction"] = "A B C"# 保存最终预测结果到提交文件
df[["prediction"]].to_csv("submission.csv")

9. 训练集 结果评估

对于训练集 拿出 prediction的Top3;看百分之多少的问题 answer出现在预测的第 1,2,3 位置

# 仅在训练集模式下执行评估(有标准答案)
if "answer" in df.columns:# 提取每个样本的Top-1, Top-2, Top-3预测for i in range(n):df.loc[i, "top_1"] = df.loc[i, "prediction"][0]  # Top-1预测(第一个字符)df.loc[i, "top_2"] = df.loc[i, "prediction"][2]  # Top-2预测(第三个字符,跳过空格)df.loc[i, "top_3"] = df.loc[i, "prediction"][4]  # Top-3预测(第五个字符,跳过空格)# 计算各Top级别的正确样本数top_i = [(df[f"top_{i}"] == df["answer"]).sum() for i in [1, 2, 3]]# 输出详细性能报告print(f"top1 : {top_i[0]}/{n}, top2 : {top_i[1]}/{n}, top3 : {top_i[2]}/{n} (total={sum(top_i)} / {n})")print(f"Accuracy: {100*top_i[0]/n:.1f}%, map3: {100*(top_i[0] + top_i[1]*1/2 + top_i[2]*1/3).sum()/n:.1f}%")

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

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

相关文章

贪吃蛇鱼小游戏抖音快手微信小程序看广告流量主开源

核心优势&#xff1a;为流量主运营者与新手量身打造 1. 为流量主运营者破解成本困局 本地化运行&#xff0c;零服务器成本&#xff1a;数据运行与存储全程在用户手机本地完成&#xff0c;无需部署服务器及后台系统&#xff0c;彻底摆脱服务器租赁、维护等硬性支出&#xff0c;…

PDF Reader 编辑阅读工具(Mac中文)

原文地址&#xff1a;PDF Reader 编辑阅读 for Mac v5.2.0 PDF Reader Pro Mac&#xff0c;是一款PDF编辑阅读&#xff0c;PDF Reader Pro让您直接在 Mac 上进行PDF文件阅读、笔记、编辑、转换、创建PDF、签署PDFs、填写PDF Forms表单、设置密码、合并拆分文件、水印等等&…

Django REST framework:SimpleRouter 使用指南

1. SimpleRouter 是什么&#xff1f; SimpleRouter 是 DRF&#xff08;Django REST framework&#xff09;提供的路由器&#xff0c;能根据 ViewSet 自动生成标准的 REST 路由&#xff0c;包括&#xff1a; GET /resources/ → 列表&#xff08;list&#xff09;POST /resource…

覆盖Transformer、GAN:掩码重建正在重塑时间序列领域!

随着大数据与深度学习的发展&#xff0c;时间序列分析的建模能力显著提升&#xff0c;而掩码重建作为一种自监督学习范式&#xff0c;已成为提升序列表征能力的重要技术。该方法通过随机掩码部分数据并重建原始序列&#xff0c;迫使模型挖掘时序依赖性与潜在模式&#xff0c;在…

用AI做TikTok影视解说,全流程全自动成片,不懂外语也能做全球矩阵!

多语种解说&#xff1a; 短剧出海狂吸美金 多语种解说抢先机 TikTok、YouTube等平台&#xff0c;尤其在非英语市场&#xff0c;内容供给仍远远不足&#xff0c;每一个小语种市场都是潜在蓝海。 有人用英语讲仙侠、西语讲爽剧、日语讲宫斗、阿语讲悬疑&#xff0c;一夜涨粉百…

解密大语言模型推理:输入处理背后的数学与工程实践

解密大语言模型推理&#xff1a;输入处理背后的数学与工程实践当你向ChatGPT提问时&#xff0c;短短几秒内就能获得流畅的回答&#xff0c;这背后隐藏着怎样的技术魔法&#xff1f;答案在于大语言模型高效推理过程中精妙的输入处理机制。在现代大语言模型推理中&#xff0c;输入…

02、连接服务器的几种方式

02、连接服务器的几种方式 1、Xshell 适用于Windows https://www.xshell.com/en/free-for-home-school/ 2、Termius 适用于MacOS 直接苹果商店下载即可 3、IDEA 连接 Tools - Deployment - Browse Remote Host 1、打开Browse Remote Host2、添加服务3、输入服务器连接信息并测试…

高并发系统设计方案(直播场景)

最近在准备面试&#xff0c;正把平时积累的笔记、项目中遇到的问题与解决方案、对核心原理的理解&#xff0c;以及高频业务场景的应对策略系统梳理一遍&#xff0c;既能加深记忆&#xff0c;也能让知识体系更扎实&#xff0c;供大家参考&#xff0c;欢迎讨论。 1. 微服务拆分 …

网络编程基础:一文搞懂 Socket、HTTP、HTTPS、TCP/IP、SSL 的关系

在日常开发中&#xff0c;我们经常听到 Socket、HTTP、HTTPS、TCP/IP、SSL 这些术语&#xff0c;这些概念往往容易混淆&#xff0c;且让人感到困惑。本文将用最通俗易懂的方式来讲清这些网络概念及其相互关系。一、从寄信说起&#xff1a;网络通信的本质假如你要给远方的朋友寄…

查看LoRA 哪个适配器处于激活状态(67)

哪个适配器处于激活状态 当前哪个适配器处于激活状态?我们来查看active_adapter属性就知道了 peft_model.active_adapter输出 default试试另一个(适配器) 你更想试试另一个(适配器)吗?只需调用set_adapter()方法即可。 peft_model.set_adapter(yoda) peft_model.act…

​​Nginx高性能Web服务器实战:从协议原理到运维优化​​

目录 前言 一、Web基础概念 1.1 什么是Web&#xff1f; 1.2 B/S架构模型 1.3 Web请求与响应流程 1.4 静态资源 vs 动态资源 二、HTTP/HTTPS协议详解 2.1 HTTP与HTTPS区别 2.2 HTTPS握手流程 2.3 HTTP状态码大全 三、Nginx核心知识 3.1 Nginx简介 3.2 Nginx vs Apache 3.3 Nginx…

【先楫HPM5E00_EVK系列-板卡测评3】hpm5e00evk平台中断、定时器、PWM、USART等基础功能详解

此文介绍了利用先楫半导体&#xff08;hpm&#xff09;官方hpm5e00_evk开发板使用的主控芯片的一些原理性知识&#xff0c;无实验内容展示&#xff0c;主要汇总了先楫半导体hpm5e00主控芯片的中断、定时器、pwm、usart等功能&#xff0c;主要内容来源于B站“HPM_FAE”的视频和官…

golang 依赖管理

目录 演进过程 1. GOPATH 阶段&#xff08;Go 1.0 - 1.10&#xff0c;2012 - 2018&#xff09; 2. Vendor 机制阶段&#xff08;Go 1.5 实验性引入&#xff0c;1.6 正式支持&#xff0c;2015 - 2018&#xff09; 3. Go Modules 过渡期&#xff08;Go 1.11 - 1.16&#xff0…

概率论—随机事件与概率

文章目录考纲术语事件的关系与运算关系运算古典概型概念和性质放入问题——随机分配取出问题——简单随机抽样问题几何概型概率的性质与计算性质计算事件的独立性和独立的判定事件的独立性判定定理举反例的思想独立试验序列概型与n重伯努利概型错题考纲 术语 (随机)试验随机事…

达梦:存储过程实现多个用户之间表的授权

一、背景在某项目现场&#xff0c;开发商想实现4个用户之间能互相拥有表的查询、删除、插入、更新权限和存储过程的执行权限。此过程只要在新增表之后&#xff0c;其他用户的权限需要授权&#xff0c;如果是手动写&#xff0c;一张表的授权就要写至少3次sql语句&#xff0c;如果…

协议分析基础

0x01 协议分析基础 网络安全领域的“基本功”&#xff1a;一切高级攻击&#xff08;漏洞利用、DDoS、渗透等&#xff09;都体现为网络流量的异常。 核心价值&#xff1a; 故障排查 &#xff1a; 定位网络延迟、丢包、无法连接等问题。性能优化 &#xff1a; 分析应用性能瓶颈。…

AI生成内容的版权迷局:GPT-4输出的“创意”版权风险与规避之道

大型语言模型&#xff08;LLM&#xff09;如 GPT-4&#xff0c;正以前所未有的速度和创造力&#xff0c;改变着内容生产的方式。无论是文章、代码、图片还是音乐&#xff0c;AI都能快速生成令人惊叹的作品。然而&#xff0c;在这股“AI内容创作浪潮”之下&#xff0c;一个严肃的…

编程与数学 03-004 数据库系统概论 19_数据库的分布式查询

编程与数学 03-004 数据库系统概论 19_数据库的分布式查询一、分布式查询的概念&#xff08;一&#xff09;分布式查询的定义&#xff08;二&#xff09;分布式查询的特点二、分布式查询的优化&#xff08;一&#xff09;查询分解&#xff08;二&#xff09;查询分配&#xff0…

java--写在 try 中的创建连接

1. 背景 在 Java 开发中&#xff0c;很多资源&#xff08;数据库连接、ZooKeeper 连接、Redis 客户端、文件流等&#xff09;都需要手动关闭。如果忘记关闭&#xff0c;会导致 资源泄漏&#xff08;连接占满、内存泄漏、文件句柄耗尽等&#xff09;。 为了避免这种问题&#xf…

蔡文胜在香港买了一栋楼,免费给创业者办公

蔡文胜在香港买了一栋楼&#xff0c;免费给创业者办公。前段时间&#xff0c;蔡文胜出售美图公司、套现约8亿港币后&#xff0c;以6.5亿港元购入香港天后道上全幢物业&#xff0c;并将其更名为“CAI大厦”。一楼是咖啡厅&#xff0c;二楼做公众活动&#xff0c;楼上会有两层会开…