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

基于 AWS SageMaker 对 DeepSeek-R1-Distilled-Llama-8B 模型的精调与实践

在当今人工智能蓬勃发展的时代,语言模型的性能优化和定制化成为研究与应用的关键方向。本文聚焦于 AWS SageMaker 平台上对 DeepSeek-R1-Distilled-Llama-8B 模型的精调实践,详细探讨这一过程中的技术细节、操作步骤以及实践价值。

一、实验背景与目标

(一)语言模型发展趋势

随着自然语言处理技术的不断演进,语言模型从基础架构的创新逐渐转向在特定场景下的性能优化和功能拓展。开发者们期望通过对预训练模型的精细调整,使其在特定领域、任务中表现更为出色,以满足多样化的应用需求。

(二)DeepSeek-R1-Distilled-Llama-8B 模型优势

DeepSeek-R1-Distilled-Llama-8B 模型融合了 DeepSeek-R1 的先进知识蒸馏技术与 Llama-8B 模型的架构优势。知识蒸馏使得小模型能够学习到大型模型的优秀特征,在保持较小参数规模的同时,具备强大的语言理解和生成能力。8B 的参数规模在性能与计算资源消耗之间达到了较好的平衡,适合在多种场景下进行部署和应用。

(三)实验目标

本次实验旨在利用 AWS SageMaker 平台的强大计算资源和丰富工具,对 DeepSeek-R1-Distilled-Llama-8B 模型进行精细调整,提升其在特定任务(如问答、文本生成等)上的性能表现。通过实验,探索如何优化模型训练过程,提高模型的泛化能力和准确性,为实际应用提供有力支持。

二、AWS SageMaker 平台概述

(一)SageMaker 核心功能

AWS SageMaker 是一个全托管的机器学习平台,为开发者提供了从数据预处理、模型训练、模型部署到模型监控的一站式解决方案。它集成了多种主流的机器学习框架,如 TensorFlow、PyTorch 等,支持在不同规模的计算实例上进行训练和推理。在本次实验中,我们将借助 SageMaker 的分布式训练功能,加速 DeepSeek-R1-Distilled-Llama-8B 模型的精调过程。

(二)SageMaker 在模型开发中的优势

  1. 高效资源管理:SageMaker 能够自动配置和管理计算资源,根据模型训练的需求动态调整实例类型和数量。这不仅提高了资源利用率,还降低了开发者的运维成本,使他们能够专注于模型开发和优化。
  2. 分布式训练支持:对于大规模的语言模型训练,分布式训练是关键。SageMaker 支持数据并行和模型并行等多种分布式训练策略,能够充分利用多个计算节点的计算能力,显著缩短训练时间。在精调 DeepSeek-R1-Distilled-Llama-8B 模型时,分布式训练可以加快模型收敛速度,提高训练效率。
  3. 内置算法与工具:SageMaker 提供了一系列内置的算法和工具,如超参数调优、模型评估等。这些工具简化了模型开发流程,帮助开发者快速找到最优的模型配置,提升模型性能。

三、实验步骤详解

 在这个演示中,我们展示了如何使用 PyTorch FSDP、QLoRA、Hugging Face PEFT 和 bitsandbytes 对 DeepSeek-R1-Distill-Llama-8B 模型进行微调。

(一)我们正在使用 SageMaker 远程装饰器在 Amazon SageMaker 训练作业上运行微调任务

JupyterLab 实例类型:ml.t3.medium

Python 版本:3.11

微调:

  • 实例类型:ml.g5.12xlarge
  • 安装所需的库,包括 Hugging Face 库,并重启内核。
    %pip install -r requirements.txt --upgrade
    %pip install -q -U python-dotenv

(二)设置配置文件路径

我们正在设置 config.yaml 文件所在的目录,以便远程装饰器可以通过 SageMaker Defaults 使用这些设置。

本次实验使用 Hugging Face 容器用于 us-east-1 区域。确保您使用的是适合您 AWS 区域的正确镜像,否则请编辑 config.yaml。容器镜像可在此处获取。

from dotenv import load_dotenv
import os# Use .env in case of hidden variables
load_dotenv()# Set path to config file
os.environ["SAGEMAKER_USER_CONFIG_OVERRIDE"] = os.getcwd()

 (三)可视化并上传数据集

我们将加载 rajpurkar/squad 数据集

import sagemakersagemaker_session = sagemaker.Session()
bucket_name = sagemaker_session.default_bucket()
default_prefix = sagemaker_session.default_bucket_prefixfrom datasets import load_dataset
import pandas as pddataset = load_dataset("rajpurkar/squad")
df = pd.DataFrame(dataset['train'])
df = df.iloc[0:1000]
df['answer'] = [answer['text'][0] for answer in df['answers']]
df = df[['context', 'question', 'answer']]df.head()from sklearn.model_selection import train_test_splittrain, test = train_test_split(df, test_size=0.1, random_state=42)print("Number of train elements: ", len(train))
print("Number of test elements: ", len(test))

创建一个提示模板,并加载一个随机样本的数据集以尝试摘要。

from random import randint# custom instruct prompt start
prompt_template = f"""<|begin_of_text|><|start_header_id|>user<|end_header_id|>\nContext:\n{{context}}\n\n{{question}}<|eot_id|><|start_header_id|>assistant<|end_header_id|>{{answer}}<|end_of_text|><|eot_id|>"""# template dataset to add prompt to each sample
def template_dataset(sample):sample["text"] = prompt_template.format(context=sample["context"],question=sample["question"],answer=sample["answer"])return sample

使用 Hugging Face Trainer 类对模型进行微调。定义我们想要使用的超参数。我们还创建一个 DataCollator,它将负责填充我们的输入和标签。 

from datasets import Dataset, DatasetDicttrain_dataset = Dataset.from_pandas(train)
test_dataset = Dataset.from_pandas(test)dataset = DatasetDict({"train": train_dataset, "test": test_dataset})train_dataset = dataset["train"].map(template_dataset, remove_columns=list(dataset["train"].features))print(train_dataset[randint(0, len(dataset))]["text"])test_dataset = dataset["test"].map(template_dataset, remove_columns=list(dataset["test"].features))

 为了训练我们的模型,我们需要将输入(文本)转换为标记 ID。这是通过 Hugging Face Transformers Tokenizer 完成的。除了 QLoRA,我们还将使用 bitsandbytes 4 位精度将冻结的 LLM 量化为 4 位,并在其上附加 LoRA 适配器。

定义训练函数

model_id = "deepseek-ai/DeepSeek-R1-Distill-Llama-8B"from accelerate import Accelerator
import datetime
from huggingface_hub import snapshot_download
import os
from peft import AutoPeftModelForCausalLM, LoraConfig, get_peft_model, prepare_model_for_kbit_training
from sagemaker.remote_function import remote
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig, set_seed
import transformers
import traceback# Start training
@remote(keep_alive_period_in_seconds=0,volume_size=100,job_name_prefix=f"train-{model_id.split('/')[-1].replace('.', '-')}",use_torchrun=True,nproc_per_node=4
)
def train_fn(model_name,train_ds,test_ds=None,lora_r=8,lora_alpha=16,lora_dropout=0.1,per_device_train_batch_size=8,per_device_eval_batch_size=8,gradient_accumulation_steps=1,learning_rate=2e-4,num_train_epochs=1,fsdp="",fsdp_config=None,gradient_checkpointing=False,merge_weights=False,seed=42,token=None
):def init_distributed():# Initialize the process grouptorch.distributed.init_process_group(backend="nccl", # Use "gloo" backend for CPUtimeout=datetime.timedelta(seconds=5400))local_rank = int(os.environ["LOCAL_RANK"])torch.cuda.set_device(local_rank)return local_rankif torch.cuda.is_available() and (torch.cuda.device_count() > 1 or int(os.environ.get("SM_HOST_COUNT", 1)) > 1):# Call this function at the beginning of your scriptlocal_rank = init_distributed()# Now you can use distributed functionalitiestorch.distributed.barrier(device_ids=[local_rank])os.environ.update({"HF_HUB_ENABLE_HF_TRANSFER": "1"})set_seed(seed)accelerator = Accelerator()if token is not None:os.environ.update({"HF_TOKEN": token})accelerator.wait_for_everyone()print("Downloading model ", model_name)os.makedirs("/tmp/tmp_folder", exist_ok=True)snapshot_download(repo_id=model_name, local_dir="/tmp/tmp_folder")print(f"Downloading model {model_name} under /tmp/tmp_folder")model_name = "/tmp/tmp_folder"tokenizer = AutoTokenizer.from_pretrained(model_name)# Set Tokenizer pad Tokentokenizer.pad_token = tokenizer.eos_tokenwith accelerator.main_process_first():# tokenize and chunk datasetlm_train_dataset = train_ds.map(lambda sample: tokenizer(sample["text"]), remove_columns=list(train_ds.features))print(f"Total number of train samples: {len(lm_train_dataset)}")if test_ds is not None:lm_test_dataset = test_ds.map(lambda sample: tokenizer(sample["text"]), remove_columns=list(test_ds.features))print(f"Total number of test samples: {len(lm_test_dataset)}")else:lm_test_dataset = Nonetorch_dtype = torch.bfloat16# Defining additional configs for FSDPif fsdp != "" and fsdp_config is not None:bnb_config_params = {"bnb_4bit_quant_storage": torch_dtype}model_configs = {"torch_dtype": torch_dtype}fsdp_configurations = {"fsdp": fsdp,"fsdp_config": fsdp_config,"gradient_checkpointing_kwargs": {"use_reentrant": False},"tf32": True}else:bnb_config_params = dict()model_configs = dict()fsdp_configurations = dict()bnb_config = BitsAndBytesConfig(load_in_4bit=True,bnb_4bit_use_double_quant=True,bnb_4bit_quant_type="nf4",bnb_4bit_compute_dtype=torch_dtype,**bnb_config_params)model = AutoModelForCausalLM.from_pretrained(model_name,trust_remote_code=True,quantization_config=bnb_config,attn_implementation="flash_attention_2",use_cache=not gradient_checkpointing,cache_dir="/tmp/.cache",**model_configs)if fsdp == "" and fsdp_config is None:model = prepare_model_for_kbit_training(model, use_gradient_checkpointing=gradient_checkpointing)if gradient_checkpointing:model.gradient_checkpointing_enable()config = LoraConfig(r=lora_r,lora_alpha=lora_alpha,target_modules="all-linear",lora_dropout=lora_dropout,bias="none",task_type="CAUSAL_LM")model = get_peft_model(model, config)trainer = transformers.Trainer(model=model,train_dataset=lm_train_dataset,eval_dataset=lm_test_dataset if lm_test_dataset is not None else None,args=transformers.TrainingArguments(per_device_train_batch_size=per_device_train_batch_size,per_device_eval_batch_size=per_device_eval_batch_size,gradient_accumulation_steps=gradient_accumulation_steps,gradient_checkpointing=gradient_checkpointing,logging_strategy="steps",logging_steps=1,log_on_each_node=False,num_train_epochs=num_train_epochs,learning_rate=learning_rate,bf16=True,ddp_find_unused_parameters=False,save_strategy="no",output_dir="outputs",**fsdp_configurations),data_collator=transformers.DataCollatorForLanguageModeling(tokenizer, mlm=False),)trainer.train()if trainer.accelerator.is_main_process:trainer.model.print_trainable_parameters()if trainer.is_fsdp_enabled:trainer.accelerator.state.fsdp_plugin.set_state_dict_type("FULL_STATE_DICT")if merge_weights:output_dir = "/tmp/model"# merge adapter weights with base model and save# save int 4 modeltrainer.model.save_pretrained(output_dir, safe_serialization=False)if accelerator.is_main_process:# clear memorydel modeldel trainertorch.cuda.empty_cache()# load PEFT modelmodel = AutoPeftModelForCausalLM.from_pretrained(output_dir,torch_dtype=torch.float16,low_cpu_mem_usage=True,trust_remote_code=True,)# Merge LoRA and base model and savemodel = model.merge_and_unload()model.save_pretrained("/opt/ml/model", safe_serialization=True, max_shard_size="2GB")else:trainer.model.save_pretrained("/opt/ml/model", safe_serialization=True)if accelerator.is_main_process:tokenizer.save_pretrained("/opt/ml/model")accelerator.wait_for_everyone()train_fn(model_id,train_ds=train_dataset,test_ds=test_dataset,per_device_train_batch_size=2,per_device_eval_batch_size=1,gradient_accumulation_steps=2,gradient_checkpointing=True,num_train_epochs=1,fsdp="full_shard auto_wrap offload",fsdp_config={'backward_prefetch': 'backward_pre','cpu_ram_efficient_loading': True,'offload_params': True,'forward_prefetch': False,'use_orig_params': False},merge_weights=True
)

(四)加载微调模型

注意:使用 merge_weights=True 运行 train_fn 以合并训练好的适配器

下载模型

import boto3
import sagemakersagemaker_session = sagemaker.Session()model_id = "deepseek-ai/DeepSeek-R1-Distill-Llama-8B"bucket_name = sagemaker_session.default_bucket()
default_prefix = sagemaker_session.default_bucket_prefix
job_prefix = f"train-{model_id.split('/')[-1].replace('.', '-')}"def get_last_job_name(job_name_prefix):sagemaker_client = boto3.client('sagemaker')search_response = sagemaker_client.search(Resource='TrainingJob',SearchExpression={'Filters': [{'Name': 'TrainingJobName','Operator': 'Contains','Value': job_name_prefix},{'Name': 'TrainingJobStatus','Operator': 'Equals','Value': "Completed"}]},SortBy='CreationTime',SortOrder='Descending',MaxResults=1)return search_response['Results'][0]['TrainingJob']['TrainingJobName']job_name = get_last_job_name(job_prefix)job_name

推理配置 

import sagemaker
from sagemaker import get_execution_role
from sagemaker import Model
instance_count = 1
instance_type = "ml.g5.4xlarge"
health_check_timeout = 700
image_uri = sagemaker.image_uris.retrieve(framework="djl-lmi",region=sagemaker_session.boto_session.region_name,version="latest"
)image_uri
if default_prefix:model_data = f"s3://{bucket_name}/{default_prefix}/{job_name}/{job_name}/output/model.tar.gz"
else:model_data = f"s3://{bucket_name}/{job_name}/{job_name}/output/model.tar.gz"model = Model(image_uri=image_uri,model_data=model_data,role=get_execution_role(),env={'HF_MODEL_ID': "/opt/ml/model", # path to where sagemaker stores the model'OPTION_TRUST_REMOTE_CODE': 'true','OPTION_ROLLING_BATCH': "vllm",'OPTION_DTYPE': 'bf16','OPTION_TENSOR_PARALLEL_DEGREE': 'max','OPTION_MAX_ROLLING_BATCH_SIZE': '1','OPTION_MODEL_LOADING_TIMEOUT': '3600','OPTION_MAX_MODEL_LEN': '4096'}
)
model_id = "deepseek-ai/DeepSeek-R1-Distill-Llama-8B"endpoint_name = f"{model_id.split('/')[-1].replace('.', '-')}-djl"
predictor = model.deploy(endpoint_name=endpoint_name,initial_instance_count=instance_count,instance_type=instance_type,container_startup_health_check_timeout=health_check_timeout,model_data_download_timeout=3600
)

 预测

import sagemaker
sagemaker_session = sagemaker.Session()
model_id = "deepseek-ai/DeepSeek-R1-Distill-Llama-8B"endpoint_name = f"{model_id.split('/')[-1].replace('.', '-')}-djl"
predictor = sagemaker.Predictor(endpoint_name=endpoint_name,sagemaker_session=sagemaker_session,serializer=sagemaker.serializers.JSONSerializer(),deserializer=sagemaker.deserializers.JSONDeserializer(),
)
base_prompt = f"""<|begin_of_text|><|start_header_id|>user<|end_header_id|>{{question}}<|eot_id|><|start_header_id|>assistant<|end_header_id|>"""
prompt = base_prompt.format(question="What statue is in front of the Notre Dame building?")response = predictor.predict({"inputs": prompt,"parameters": {"temperature": 0.2,"top_p": 0.9,"return_full_text": False,"stop": ['<|eot_id|>', '<|end_of_text|>']}
})response = response["generated_text"].split("<|end_of_text|>")[0]response

 删除端点

predictor.delete_model()
predictor.delete_endpoint(delete_endpoint_config=True)

四、实验结果与分析

(一)性能指标对比

将精调后的 DeepSeek-R1-Distilled-Llama-8B 模型与预训练模型在相同任务上进行性能对比。结果显示,精调后的模型在准确率、F1 值等指标上有显著提升,表明精调过程有效地提高了模型在特定任务上的性能表现。

(二)结果分析

  1. 优势分析:精调后的模型能够更好地理解和处理特定任务的数据,生成更准确、更符合需求的回答。这得益于在精调过程中,模型学习了目标任务的特定模式和知识,增强了对任务的适应性。
  2. 局限性分析:尽管精调后的模型性能有所提升,但仍然存在一些局限性。例如,在处理一些复杂的、语义模糊的问题时,模型的回答可能不够准确或完整。这可能是由于数据集的覆盖范围有限,或者模型的架构在处理复杂语义时存在一定的困难。

五、总结与展望

(一)实验总结

本次实验在 AWS SageMaker 平台上成功对 DeepSeek-R1-Distilled-Llama-8B 模型进行了精调,通过合理配置实验环境、选择合适的精调算法和优化策略,提升了模型在特定任务上的性能。实验结果表明,SageMaker 平台为语言模型的精调提供了强大的支持,QLoRA 算法在减少计算成本的同时有效地提高了模型性能。

(二)未来展望

  1. 模型改进方向:进一步探索更先进的精调算法和技术,如基于注意力机制的优化方法,以提高模型对复杂语义的理解和处理能力。同时,尝试增加数据集的规模和多样性,提高模型的泛化能力。
  2. 应用拓展:将精调后的模型应用到更多的实际场景中,如智能客服、智能写作等领域,验证模型的实用性和有效性。通过实际应用的反馈,不断优化模型,提升用户体验。

相关文章:

基于 AWS SageMaker 对 DeepSeek-R1-Distilled-Llama-8B 模型的精调与实践

在当今人工智能蓬勃发展的时代&#xff0c;语言模型的性能优化和定制化成为研究与应用的关键方向。本文聚焦于 AWS SageMaker 平台上对 DeepSeek-R1-Distilled-Llama-8B 模型的精调实践&#xff0c;详细探讨这一过程中的技术细节、操作步骤以及实践价值。 一、实验背景与目标 …...

如何使用DeepSeek R1

以下是如何使用DeepSeek R1的详细步骤&#xff1a; ### 一、注册DeepSeek账户 1. **访问官方网站**&#xff1a; - 打开浏览器&#xff0c;访问[chat.deepseek.com](http://chat.deepseek.com)。 2. **注册账户**&#xff1a; - 使用电子邮件、Google账户或86手机号码…...

大屏 UI 设计风格的未来趋势

在科技飞速革新的时代&#xff0c;大屏设备的应用领域不断拓展&#xff0c;从城市的智能交通指挥中心&#xff0c;到商场的互动广告大屏&#xff0c;再到家庭的超大尺寸智能电视&#xff0c;大屏已然成为信息展示与交互的关键载体。大屏 UI 设计风格也随之不断演变&#xff0c;…...

unity学习22:Application类其他功能

目录 1 是否允许后台运行 1.1 Application.runInBackground&#xff0c;显示是否允许后台运行 1.2 设置的地方 2 打开URL 2.1 Application.OpenURL("") 打开超链接 3 退出游戏 3.1 Application.Quit() 退出游戏 4 场景相关 5 返回游戏状态 6 控制游戏的行…...

51单片机入门_02_C语言基础0102

C语言基础部分可以参考我之前写的专栏C语言基础入门48篇 以及《从入门到就业C全栈班》中的C语言部分&#xff0c;本篇将会结合51单片机讲差异部分。 课程主要按照以下目录进行介绍。 文章目录 1. 进制转换2. C语言简介3. C语言中基本数据类型4. 标识符与关键字5. 变量与常量6.…...

定位的叠放次序 z-index

浮动定位和绝对定位的区别&#xff1a; 浮动只会压住它下面标准流的盒子&#xff0c;但是不会压住下面标准流盒子里面的文字&#xff0c;但是绝对定位&#xff08;固定定位&#xff09;会压住下面标准流所有的内容。...

ESP32-S3模组上跑通esp32-camera(36)

接前一篇文章:ESP32-S3模组上跑通esp32-camera(35) 一、OV5640初始化 2. 相机初始化及图像传感器配置 上一回继续对reset函数的后一段代码进行解析。为了便于理解和回顾,再次贴出reset函数源码,在components\esp32-camera\sensors\ov5640.c中,如下: static int reset…...

前端性能优化:HMR热更新和预获取加载

最近发现项目开发&#xff0c;有点加载快&#xff0c;有点却是卡机式&#xff0c;甚至刷新导致白屏情况。于是&#xff0c;我找开发和性能优化的方法&#xff0c;找到下面几种。 本文将深入探讨 预获取&#xff08;Prefetch&#xff09;、动态导入&#xff08;Dynamic Import&…...

【自学笔记】计算机网络的重点知识点-持续更新

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 计算机网络重点知识点一、计算机网络概述二、网络分类三、网络性能指标四、网络协议与体系结构五、数据交换方式六、物理层与数据链路层七、网络层与运输层八、应用…...

算法基础学习——二分查找(附带Java模板)

有单调性的数列一定可以使用二分&#xff0c;没有单调性的题目也可能可以使用二分&#xff1b; &#xff08;一&#xff09;整数二分 二分的本质&#xff1a; 在某个整数区间内&#xff0c;存在某种性质使得区间内左半边的数都不满足该性质&#xff1b;而右半边的数都满足该性…...

【llm对话系统】大模型源码分析之llama模型的long context更长上下文支持

1. 引言 Llama模型的一个重要特性是支持长上下文处理。本文将深入分析Llama源码中实现长上下文的关键技术点&#xff0c;包括位置编码(position embedding)的外推方法、注意力机制的优化等。我们将通过详细的代码解析来理解其实现原理。 2. 位置编码的外推实现 2.1 旋转位置…...

单片机基础模块学习——NE555芯片

一、NE555电路图 NE555也称555定时器,本文主要利用NE555产生方波发生电路。整个电路相当于频率可调的方波发生器。 通过调整电位器的阻值,方波的频率也随之改变。 RB3在开发板的位置如下图 测量方波信号的引脚为SIGHAL,由上面的电路图可知,NE555已经构成完整的方波发生电…...

Hive:struct数据类型,内置函数(日期,字符串,类型转换,数学)

struct STRUCT&#xff08;结构体&#xff09;是一种复合数据类型&#xff0c;它允许你将多个字段组合成一个单一的值, 常用于处理嵌套数据&#xff0c;例如当你需要在一个表中存储有关另一个实体的信息时。你可以使用 STRUCT 函数来创建一个结构体。STRUCT 函数接受多个参数&…...

最优化问题 - 内点法

以下是一种循序推理的方式&#xff0c;来帮助你从基础概念出发&#xff0c;理解 内点法&#xff08;Interior-Point Method, IPM&#xff09; 是什么、为什么要用它&#xff0c;以及它是如何工作的。 1. 问题起点&#xff1a;带不等式约束的优化 假设你有一个带不等式约束的优…...

vim交换文件的工作原理

在vim中&#xff0c;交换文件是一个临时文件&#xff0c;当我们使用vim打开一个文件进行编辑&#xff08;一定得是做出了修改才会产生交换文件&#xff09;时候&#xff0c;vim就会自动创建一个交换文件&#xff0c;而之后我们对于文件的一系列修改都是在交换文件中进行的&…...

CISCO路由基础全集

第一章&#xff1a;交换机的工作原理和基本技能_交换机有操作系统吗-CSDN博客文章浏览阅读1.1k次&#xff0c;点赞24次&#xff0c;收藏24次。交换机可看成是一台特殊的计算机&#xff0c;同样有CPU、存储介质和操作系统&#xff0c;只是与计算机的稍有不同。作为数据交换设备&…...

网络直播时代的营销新策略:基于受众分析与开源AI智能名片2+1链动模式S2B2C商城小程序源码的探索

摘要&#xff1a;随着互联网技术的飞速发展&#xff0c;网络直播作为一种新兴的、极具影响力的媒体形式&#xff0c;正逐渐改变着人们的娱乐方式、消费习惯乃至社交模式。据中国互联网络信息中心数据显示&#xff0c;网络直播用户规模已达到3.25亿&#xff0c;占网民总数的45.8…...

2024年终总结——今年是蜕变的一年

2024年终总结 摘要前因转折找工作工作的成长人生的意义 摘要 2024我从国企出来&#xff0c;兜兜转转还是去了北京&#xff0c;一边是工资低、感情受挫&#xff0c;一边是压力大、项目经历少&#xff0c;让我一度找不到自己梦寐以求的工作&#xff0c;我投了一家又一家&#xff…...

AutoDL 云服务器:普通 用户 miniconda 配置

AutoDL 初始状态下只有root用户&#xff0c;miniconda 安装在root用户目录下 /// 增加普通用户 rootautodl-container-1c0641804d-5bb7040c:~/Desktop# apt updaterootautodl-container-1c0641804d-5bb7040c:~/Desktop# apt install sudorootautodl-container-1c0641804d-5…...

渲染流程概述

渲染流程包括 CPU应用程序端渲染逻辑 和 GPU渲染管线 一、CPU应用程序端渲染逻辑 剔除操作对物体进行渲染排序打包数据调用Shader SetPassCall 和 Drawcall 1.剔除操作 视椎体剔除 &#xff08;给物体一个包围盒&#xff0c;利用包围盒和摄像机的视椎体进行碰撞检测&#xf…...

前端力扣刷题 | 4:hot100之 子串

560. 和为K的子数组 给你一个整数数组 nums 和一个整数 k &#xff0c;请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 示例&#xff1a; 输入&#xff1a;nums [1,1,1], k 2 输出&#xff1a;2 法一&#xff1a;暴力法 var subar…...

Julia 之 @btime 精准测量详解

Julia 语言因其高性能和易用性在科学计算、数据分析等领域获得了广泛关注。在性能优化中&#xff0c;精准测量代码执行时间是至关重要的任务&#xff0c;而 Julia 提供了强大的工具 btime 来辅助这一任务。本文将围绕 Julia 的 btime 来展开&#xff0c;帮助读者深入理解并高效…...

【Django教程】用户管理系统

Get Started With Django User Management 开始使用Django用户管理 By the end of this tutorial, you’ll understand that: 在本教程结束时&#xff0c;您将了解&#xff1a; Django’s user authentication is a built-in authentication system that comes with pre-conf…...

【机器学习】自定义数据集 使用pytorch框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测

一、使用pytorch框架实现逻辑回归 1. 数据部分&#xff1a; 首先自定义了一个简单的数据集&#xff0c;特征 X 是 100 个随机样本&#xff0c;每个样本一个特征&#xff0c;目标值 y 基于线性关系并添加了噪声。将 numpy 数组转换为 PyTorch 张量&#xff0c;方便后续在模型中…...

C语言连接Mysql

目录 C语言连接Mysql下载 mysql 开发库 方法介绍mysql_init()mysql_real_connect()mysql_query()mysql_store_result()mysql_num_fields()mysql_fetch_fields()mysql_fetch_row()mysql_free_result()mysql_close() 完整代码 C语言连接Mysql 下载 mysql 开发库 方法一&#xf…...

Windows上通过Git Bash激活Anaconda

在Windows上配置完Anaconda后&#xff0c;普遍通过Anaconda Prompt激活虚拟环境并执行Python&#xff0c;如下图所示&#xff1a; 有时需要连续执行多个python脚本时&#xff0c;直接在Anaconda Prompt下可以通过在以下方式&#xff0c;即命令间通过&&连接&#xff0c;…...

面试经典150题——图

文章目录 1、岛屿数量1.1 题目链接1.2 题目描述1.3 解题代码1.4 解题思路 2、被围绕的区域2.1 题目链接2.2 题目描述2.3 解题代码2.4 解题思路 3、克隆图3.1 题目链接3.2 题目描述3.3 解题代码3.4 解题思路 4、除法求值4.1 题目链接4.2 题目描述4.3 解题代码4.4 解题思路 5、课…...

学习数据结构(1)时间复杂度

1.数据结构和算法 &#xff08;1&#xff09;数据结构是计算机存储、组织数据的方式&#xff0c;指相互之间存在⼀种或多种特定关系的数据元素的集合 &#xff08;2&#xff09;算法就是定义良好的计算过程&#xff0c;取一个或一组的值为输入&#xff0c;并产生出一个或一组…...

项目集成GateWay

文章目录 1.环境搭建1.创建sunrays-common-cloud-gateway-starter模块2.目录结构3.自动配置1.GateWayAutoConfiguration.java2.spring.factories 3.pom.xml4.注意&#xff1a;GateWay不能跟Web一起引入&#xff01; 1.环境搭建 1.创建sunrays-common-cloud-gateway-starter模块…...

【Ubuntu】使用远程桌面协议(RDP)在Windows上远程连接Ubuntu

使用远程桌面协议&#xff08;RDP&#xff09;在Windows上远程连接Ubuntu 远程桌面协议&#xff08;RDP&#xff09;是一种允许用户通过图形界面远程控制计算机的协议。本文将详细介绍如何在Ubuntu上安装和配置xrdp&#xff0c;并通过Windows的远程桌面连接工具访问Ubuntu。 …...