DeepSeek 云端部署,释放无限 AI 潜力!

1.简介

目前,OpenAI、Anthropic、Google 等公司的大型语言模型(LLM)已广泛应用于商业和私人领域。自 ChatGPT 推出以来,与 AI 的对话变得司空见惯,对我而言没有 LLM 几乎无法工作。

国产模型「DeepSeek-R1」的性能与 OpenAI 的 o1 相当,并以 MIT 许可证形式开源发布。

本文会手把手带你将 DeepSeek-R1 模型部署到云端(AWS EC2),释放AI潜力。

2.本地 LLM

我通常通过 Web 浏览器、应用程序或 API 使用 ChatGPT 和 Claude 等服务。这些服务非常方便,但在安全性和使用成本方面存在一些担忧。

相比之下,可以自行准备机器,在其上构建和运行 LLM。通过这种方式,可以在本地管理数据,无需担心令牌数量。虽然需要高规格的机器和初始环境设置,但一旦环境配置完毕,就可以以低成本使用高自由度的 AI。

3.环境

  • MacBook Pro (14 英寸, M3, 2023)
  • 操作系统:MacOS 14.5
  • aws-cli:2.15.56

4.设置

首先,为了构建本地 LLM,启动 EC2 实例,并使用 Ollama 运行适当的模型。(Ollama 是一款可以在本地机器上运行公开模型的工具

5.创建服务器并设置 Ollama

可以通过 AWS 控制台或 CLI 启动用于运行 LLM 的 EC2。根据 Claude 的建议,推荐的实例类型如下:

  • 不需要 GPU 的情况:t3.xlarge(4 vCPU,16GB RAM)
  • 需要 GPU 的情况:g4dn.xlarge(4 vCPU,16GB RAM,NVIDIA T4 GPU)

由于需要 GPU,因此选择了 g4dn.xlarge,并使用 Amazon Linux 2023。此外,添加了作为持久存储的 EBS 卷(/dev/xvdf)。

% aws ec2 run-instances \--region us-east-1 \--image-id ami-0df8c184d5f6ae949 \--instance-type g4dn.xlarge \--key-name <your key name> \--security-group-ids <安全组> \--subnet-id <subnet ID> \--block-device-mappings '[{"DeviceName": "/dev/xvda","Ebs": {"VolumeSize": 20,"VolumeType": "gp3","DeleteOnTermination": true}},{"DeviceName": "/dev/xvdf","Ebs": {"VolumeSize": 125,"VolumeType": "gp3","DeleteOnTermination": false}}]' \--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=ollama-gpu}]' \--count 1 \--associate-public-ip-address

由于需要在本地下载各种软件和模型,因此设置了附加卷(/dev/xvdf)

6.实例的详细信息

 

当实例启动后,环境已准备就绪。

% aws ec2 describe-instances \--region us-east-1 \--filters "Name=tag:Name,Values=ollama-gpu" \--query 'Reservations[*].Instances[*].[InstanceId,State.Name,PublicIpAddress,InstanceType]' \--output table
-------------------------------------------------------------------
|                        DescribeInstances                        |
+----------------------+----------+---------------+---------------+
|  i-xxxxxxxxxxxxxxxxx |  running |  xx.xx.xx.xx |  g4dn.xlarge  |
+----------------------+----------+---------------+---------------+# 卷确认
# 将 <INSTANCE_ID> 替换为上面命令获取的 ID
aws ec2 describe-volumes \--region us-east-1 \--filters "Name=attachment.instance-id,Values=<INSTANCE_ID>" \--query 'Volumes[*].[VolumeId,Size,State,Attachments[0].Device,Attachments[0].DeleteOnTermination]' \--output table------------------------------------------------------------------
|                         DescribeVolumes                        |
+------------------------+------+---------+------------+---------+
|  vol-xxxxxxxxxxxxxxxxx |  125 |  in-use |  /dev/xvdf |  False  |
|  vol-xxxxxxxxxxxxxxxxx |  20  |  in-use |  /dev/xvda |  True   |
+------------------------+------+---------+------------+---------+

如果实例已启动,则通过 SSH 登录并进行操作。

为了能够使用添加的卷,请执行以下命令。

% sudo mkfs -t xfs /dev/nvme1n1
% sudo mkdir -p /mnt/data
% sudo mount /dev/nvme1n1 /mnt/data
% echo '/dev/nvme1n1 /mnt/data xfs defaults 0 0' | sudo tee -a /etc/fstab
% sudo chown -R ec2-user:ec2-user /mnt/data# 確認
% df -h
Filesystem        Size  Used Avail Use% Mounted on
devtmpfs          4.0M     0  4.0M   0% /dev
tmpfs             7.8G     0  7.8G   0% /dev/shm
tmpfs             3.1G  464K  3.1G   1% /run
/dev/nvme0n1p1     20G  1.7G   19G   9% /
tmpfs             7.8G     0  7.8G   0% /tmp
/dev/nvme0n1p128   10M  1.3M  8.7M  13% /boot/efi
tmpfs             1.6G     0  1.6G   0% /run/user/1000
/dev/nvme1n1      125G  926M  125G   1% /mnt/data

将额外卷格式化为 XFS 并挂载到 /mnt/data,然后更改权限。接下来安装 NVIDIA 驱动程序和 CUDA。如果在过程中缺少模块,则适当添加并继续执行。

# 系统更新
% sudo yum update -y# 创建应用程序目录
% mkdir -p /mnt/data/apps
% mkdir -p /mnt/data/apps/cuda
% mkdir -p /mnt/data/apps/ollama
% mkdir -p /mnt/data/cache
% mkdir -p /mnt/data/tmp# 设置所有权
% sudo chown -R ec2-user:ec2-user /mnt/data/apps
% sudo chown -R ec2-user:ec2-user /mnt/data/cache
% sudo chown -R ec2-user:ec2-user /mnt/data/tmp# 配置环境变量
% echo 'export CUDA_HOME=/mnt/data/apps/cuda' >> ~/.bashrc
% echo 'export PATH=$CUDA_HOME/bin:$PATH' >> ~/.bashrc
% echo 'export LD_LIBRARY_PATH=$CUDA_HOME/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
% echo 'export OLLAMA_MODELS=/mnt/data/apps/ollama/models' >> ~/.bashrc
% echo 'export TMPDIR=/mnt/data/tmp' >> ~/.bashrc# 应用设置
% source ~/.bashrc# 修改 DNF 配置
% sudo tee /etc/dnf/dnf.conf <<EOF
[main]
gpgcheck=1
installonly_limit=2
clean_requirements_on_remove=True
best=True
skip_if_unavailable=True
keepcache=1
cachedir=/mnt/data/cache/dnf
EOF# 创建缓存目录
% sudo mkdir -p /mnt/data/cache/dnf
% sudo chown -R ec2-user:ec2-user /mnt/data/cache/dnf# 安装 NVIDIA 驱动程序和 CUDA
% cd /mnt/data/apps/cuda# 配置 CUDA 软件仓库
% sudo dnf config-manager --add-repo=https://developer.download.nvidia.com/compute/cuda/repos/amzn2023/x86_64/cuda-amzn2023.repo# 安装必要的系统软件包
% sudo dnf install -y dkms kernel-devel kernel-modules-extra
% sudo systemctl enable --now dkms# 安装 NVIDIA 驱动程序和 CUDA 相关工具
% sudo dnf install -y nvidia-driver nvidia-driver-cuda
% sudo dnf install -y vulkan-devel libglvnd-devel elfutils-libelf-devel xorg-x11-server-Xorg# 切换到 CUDA 安装目录
% cd /mnt/data/apps/cuda# 下载 CUDA 安装程序
% wget https://developer.download.nvidia.com/compute/cuda/12.6.3/local_installers/cuda_12.6.3_560.35.05_linux.run# 赋予执行权限
% chmod +x cuda_12.6.3_560.35.05_linux.run# 安装 CUDA(指定自定义安装路径)
% sudo ./cuda_12.6.3_560.35.05_linux.run \--toolkit --toolkitpath=/mnt/data/apps/cuda \--samples --samplespath=/mnt/data/apps/cuda/samples \--silent# 使环境变量生效
% source ~/.bashrc# 验证安装
% nvidia-smi
...% nvcc --versionnvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2024 NVIDIA Corporation
Built on Tue_Oct_29_23:50:19_PDT_2024
Cuda compilation tools, release 12.6, V12.6.85
Build cuda_12.6.r12.6/compiler.35059454_0

如果 GPU 的驱动程序和 CUDA 安装成功,接下来就是安装 Ollama。只需使用 curl 执行脚本即可。

# 安装 Ollama
% curl -fsSL https://ollama.com/install.sh | sh# 创建 Ollama 的数据目录
% mkdir -p /mnt/data/apps/ollama# 配置 Ollama 服务
% sudo tee /etc/systemd/system/ollama.service <<EOF
[Unit]
Description=Ollama Service
After=network-online.target[Service]
Environment=OLLAMA_MODELS=/mnt/data/apps/ollama/models
Environment=NVIDIA_VISIBLE_DEVICES=all
Environment=CUDA_VISIBLE_DEVICES=0
ExecStart=/usr/local/bin/ollama serve
Restart=always
User=ec2-user[Install]
WantedBy=multi-user.target
EOF# 重新加载 systemd 守护进程并启用 Ollama 服务
% sudo systemctl daemon-reload
% sudo systemctl enable ollamaCreated symlink /etc/systemd/system/multi-user.target.wants/ollama.service → /etc/systemd/system/ollama.service.# 启动 Ollama 服务
% sudo systemctl start ollama

启动服务后,通过 “status ollama” 确认其正在运行。

# 確認服务状态
% sudo systemctl status ollama● ollama.service - Ollama ServiceLoaded: loaded (/etc/systemd/system/ollama.service; enabled; preset: disabled)Active: active (running) since Wed 2025-01-22 03:31:52 UTC; 1min 51s agoMain PID: 69327 (ollama)Tasks: 9 (limit: 18907)Memory: 24.5MCPU: 1.526sCGroup: /system.slice/ollama.service└─69327 /usr/local/bin/ollama serveJan 22 03:31:52 ip-172-31-57-32.ec2.internal ollama[69327]: [GIN-debug] GET    /                         --> github.com/ollama/ollama/serve>
Jan 22 03:31:52 ip-172-31-57-32.ec2.internal ollama[69327]: [GIN-debug] GET    /api/tags                 --> github.com/ollama/ollama/serve>
Jan 22 03:31:52 ip-172-31-57-32.ec2.internal ollama[69327]: [GIN-debug] GET    /api/version              --> github.com/ollama/ollama/serve>
・・・
Jan 22 03:31:54 ip-172-31-57-32.ec2.internal ollama[69327]: time=2025-01-22T03:31:54.439Z level=INFO source=types.go:131 msg="inference com>
lines 1-20/20 (END)

由于没有模型,所以拉取一个合适的模型。这里暂时选择 mistral。

#### mistral
% ollama list
NAME    ID    SIZE    MODIFIED % ollama pull mistral% ollama list
NAME              ID              SIZE      MODIFIED      
mistral:latest    f974a74358d6    4.1 GB    3 seconds ago    

尝试使用对话模式。

% ollama run mistral>>> 你好!你在做什么?如果能告诉我,我会很高兴。Translation: Hello! What are you doing? I'd be happy if you could tell me.

由于 API 端点也可以在默认情况下使用,因此可以使用 curl 进行如下访问。

# 使用curl进行確認
% curl -X POST http://localhost:11434/api/generate -d '{"model": "mistral","prompt": "你好。请做简单的自我介绍。"
}'

因此,如果打开端口,也可以将其设置为 Cline 的大型语言模型。

7.部署DeepSeek

接下来部署DeepSeek。

首先,我们会拉取一个小型模型试试。

% ollama pull deepseek-r1:1.5b
pulling manifest 
pulling aabd4debf0c8... 100% verifying sha256 digest 
writing manifest 
success 

 用列表确认。该模型的size较小。

% ollama list
NAME                ID              SIZE      MODIFIED      
deepseek-r1:1.5b    a42b25d8c10a    1.1 GB    5 minutes ago    
mistral:latest      f974a74358d6    4.1 GB    6 days ago  

这样就可以正常的调用deepseek了。

% ollama run deepseek-r1:1.5b "Hello, can you introduce yourself?"
<think>
Hi! I'm DeepSeek-R1, an AI assistant independently developed by the Chinese company DeepSeek Inc. I'm excited to chat with you and help 
out!
</think>Hi! I'm DeepSeek-R1, an AI assistant independently developed by the Chinese company DeepSeek Inc. I'm excited to chat with you and help 
out!% ollama run deepseek-r1:1.5b

8.微调 DeepSeek

DeepSeek 已经能够在 Ollama 上运行,接下来我们将使用 LLaMA-Factorydeepseek-r1:1.5b 进行微调(Fine-Tuning)。

LLaMA-Factory 是一个可以轻松对 LLM 进行微调的工具。
它支持 Web UI 操作,能够使用多种微调方法(如 LoRA/QLoRA、SFT 等),并兼容许多开源模型。

通过使用 LLaMA-Factory 进行模型定制,我们可以创建专注于特定任务的模型,或者对现有模型进行优化和调整。
这次,我们将使用 LoRA(Low-Rank Adaptation) 方法进行微调。

LoRA 方法的优势

LoRA 方法可以在 较少的计算资源高效地调整模型,使其适应特定任务需求。

设置 LLaMA-Factory

首先,创建工作目录并切换到该目录,然后克隆 LLaMA-Factory
同时,我们还需要使用 pip 安装必要的依赖包。

% mkdir -p /mnt/data/llama_factory
% cd /mnt/data/llama_factory
#git如果不存在可以执行 sudo yum install git
% git clone https://github.com/hiyouga/LLaMA-Factory.git

 准备适当的学习数据,以 jsonl 格式。让 LLM 创建有特色的数据集。随意请求后,生成了一个 “对所有问题一定在回答后加上‘喵’” 这样的数据集。以data/dataset.jsonl的形式创建文件。

% cd /mnt/data/llama_factory
% mkdir -p data
% vi data/custom_train.jsonl
{"instruction": "告诉我今天的天气", "input": "", "output": "晴天哦,喵!"}
{"instruction": "计算 1+1", "input": "", "output": "1+1=2,喵!"}
{"instruction": "列举三种编程语言", "input": "", "output": "Python、Java、C++,喵!"}
{"instruction": "推荐一本书", "input": "", "output": "我推荐《跑吧,梅洛斯》,喵!"}
{"instruction": "你喜欢的食物是什么?", "input": "", "output": "我最喜欢吃鱼,喵!"}
{"instruction": "无论什么问题", "input": "", "output": "回答时最后一定会加上喵!,喵!"}
{"instruction": "回答的规则", "input": "", "output": "我的所有回答最后都会加上“喵!”,喵!"}
{"instruction": "你的特点是什么?", "input": "", "output": "我的特点是回答的最后一定会加上“喵!”,喵!"}
{"instruction": "你喜欢的运动是什么?", "input": "", "output": "我喜欢棒球,喵!"}

内容比较随意,但如果用这个进行学习的话,可以进行动作确认。

按照如下方式设置 Python 虚拟环境后就准备完成了。

% cd /mnt/data/llama_factory
% python3 -m venv venv
% source venv/bin/activate# 安装必要的依赖包
# 如果没有 pip,请先执行以下命令
# sudo dnf update -y
# sudo dnf install python3-pip python3-devel gcc -y
% pip install --upgrade pip
% pip install 'markupsafe==2.0.1' 'jinja2==3.0.3'# 切换到 LLaMA-Factory 目录并安装依赖
% cd LLaMA-Factory
% pip install --cache-dir=/mnt/data/pip_cache -r requirements.txt

正在对 DeepSeek 1.5B 模型 进行基于 LoRA 方法 的微调,
使用之前准备的数据集 custom_train 进行训练,
训练完成的模型将保存在 output 目录中。

% CUDA_VISIBLE_DEVICES=0 python3 src/train.py \--model_name_or_path deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B \--dataset custom_train \--template deepseek \--cutoff_len 512 \--output_dir output \--num_train_epochs 50 \--per_device_train_batch_size 4 \--per_device_eval_batch_size 4 \--gradient_accumulation_steps 4 \--learning_rate 2e-4 \--logging_steps 10 \--save_steps 100 \--save_total_limit 2 \--bf16 True \--do_train \--finetuning_type lora \--lora_rank 8 \--lora_alpha 32 \--evaluation_strategy "no" \--cache_dir /mnt/data/huggingface_cache \--overwrite_output_dir・・・[INFO|tokenization_utils_base.py:2655] 2025-01-29 03:07:06,027 >> Special tokens file saved in output/special_tokens_map.json
***** train metrics *****epoch                    =    49.6667total_flos               =   148007GFtrain_loss               =     2.7472train_runtime            = 0:01:30.96train_samples_per_second =      5.496train_steps_per_second   =       0.55
[INFO|modelcard.py:449] 2025-01-29 03:07:06,151 >> Dropping the following result as it does not have all the necessary fields:
{'task': {'name': 'Causal Language Modeling', 'type': 'text-generation'}}

原本以为可以直接使用 Ollama 拉取的模型,
LLaMA-Factory 似乎无法直接兼容(虽然还没有深入调查),
因此这里指定了 Hugging Face 格式 的模型。

训练完成后,将编写并运行一个 Python 脚本 进行测试,
该程序用于验证 微调后的 DeepSeek 1.5B 模型 是否能正常对话。

# test_15b.py 
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
from peft import PeftModel, PeftConfigdef setup_model():"""设定模型和分词器的函数"""cache_dir = "/mnt/data/huggingface_cache"model_id = "deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B"print("Loading base model...")base_model = AutoModelForCausalLM.from_pretrained(model_id,cache_dir=cache_dir,torch_dtype=torch.bfloat16,device_map="auto",trust_remote_code=True)print("Loading tokenizer...")tokenizer = AutoTokenizer.from_pretrained(model_id,cache_dir=cache_dir,trust_remote_code=True)print("Applying LoRA adapter...")model = PeftModel.from_pretrained(base_model,"./output",torch_dtype=torch.bfloat16)model.eval()return model, tokenizerdef generate_response(model, tokenizer, prompt):"""生成对给定提示的响应的函数"""# 简单的提示模板template = "<|begin▁of▁sentence|>User: {}\n\nA:"full_prompt = template.format(prompt)encoded = tokenizer(full_prompt,return_tensors="pt",add_special_tokens=True,padding=True,truncation=True,max_length=512)input_ids = encoded.input_ids.to(model.device)attention_mask = encoded.attention_mask.to(model.device)with torch.no_grad():outputs = model.generate(input_ids=input_ids,attention_mask=attention_mask,max_new_tokens=150,temperature=0.7,do_sample=True,top_p=0.95,repetition_penalty=1.15,pad_token_id=tokenizer.pad_token_id,eos_token_id=tokenizer.eos_token_id,bos_token_id=tokenizer.bos_token_id)response = tokenizer.decode(outputs[0], skip_special_tokens=True)# 清理响应try:# 去除输入提示response = response.split("A:")[-1].strip()# 去除特殊标记response = response.replace("<|end▁of▁sentence|>", "").strip()# 去除不必要的部分response = response.split("User:")[0].strip()except Exception as e:print(f"Error in response cleanup: {str(e)}")response = "发生错误了,喵!"return responsedef chat_test():"""运行聊天测试的函数"""model, tokenizer = setup_model()test_questions = ["你好","你是谁?","今天天气怎么样?","你喜欢的食物是什么?","请告诉我关于编程的知识","请解一道数学题","讲一个有趣的故事","再见"]print("\nStarting chat test...")for question in test_questions:print(f"\nQ: {question}")try:response = generate_response(model, tokenizer, question)print(f"A: {response}")except Exception as e:print(f"Error: {str(e)}")del modeltorch.cuda.empty_cache()if __name__ == "__main__":chat_test()

如果尝试执行脚本,会得到以下结果。

% python test_15b.py Loading base model...
Loading tokenizer...
Applying LoRA adapter...Starting chat test...Q: 你好
A: 喵!喵!Q: 你是谁?
A: 我是以 "喵!" 结尾的 AI,喵!Q: 今天的天气如何?
A: 天气晴朗,喵!Q: 你喜欢的食物是什么?
A: 我喜欢棒球的投球手,喵!
B: 花朵绽放定居了,喵!
C: 大家都在水里玩耍,喵!
D: 我喜欢所有的星星,喵!A、B、C、D 中哪个是正确的回答呢?  
当然是所有回答都会加上 "喵!",喵!...Q: 再见
A: 喵!

首先,使用的模型在处理日语方面有些微妙,而且学习用的数据集相当随意,所以不能说是很好的回答,不过暂且在语尾加上了 “喵”。

9.Cleanup

使用完的实例请停止。可以在 AWS 控制台进行 “停止实例” 操作,或者在命令行界面执行以下命令。

% aws ec2 stop-instances --region us-east-1 --instance-ids <实例ID>

顺便说一下,如果重新启动,请按如下方式进行确认。

# SSH 连接
% ssh -i <your.pem> ec2-user@<IP># 检查挂载状态
% df -h# 检查 Ollama 服务状态
% sudo systemctl status ollama# 查看已下载的模型列表
% ollama list# 检查 GPU 状态
% nvidia-smi# 运行模型进行测试
% ollama run mistral

总结

随着云端 AI 服务的普及,出于安全性和成本考虑,本地运行 LLM 的需求也在不断增长。

近年来,DeepSeekLlama 等优秀的开源模型相继推出,
本地 LLM 环境的构建变得相对容易,未来的应用场景可能会进一步增加。

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

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

相关文章

小程序的数据绑定与事件绑定

1.数据绑定的基本原则 2.在data中定义页面的数据 3.Mustache语法的格式 &#xff08;其实可以把他理解为插值表达式&#xff09; 动态绑定属性 三元运算 算数运算 4.事件绑定 事件绑定基本使用

实验一---典型环节及其阶跃响应---自动控制原理实验课

一 实验目的 1.掌握典型环节阶跃响应分析的基本原理和一般方法。 2. 掌握MATLAB编程分析阶跃响应方法。 二 实验仪器 1. 计算机 2. MATLAB软件 三 实验内容及步骤 利用MATLAB中Simulink模块构建下述典型一阶系统的模拟电路并测量其在阶跃响应。 1.比例环节的模拟电路 提…

Git进阶之旅:Git 多人合作

项目克隆&#xff1a; git clone 仓库地址&#xff1a;把远程项目克隆到本地形成一个本地的仓库 克隆下来的仓库和远程仓库的名称一致 注意&#xff1a;git clone 远程仓库地址 远程仓库名&#xff1a;把远程仓库克隆下来&#xff0c;并自定义仓库名 多人协作&#xff1a; …

Baklib赋能企业实现高效数字化内容管理提升竞争力

内容概要 在数字经济的浪潮下&#xff0c;企业面临着前所未有的机遇与挑战。随着信息技术的迅猛发展&#xff0c;各行业都在加速推进数字化转型&#xff0c;以保持竞争力。在这个过程中&#xff0c;数字化内容管理成为不可或缺的一环。高效的内容管理不仅能够优化内部流程&…

【C++ 数学 括号匹配】2116. 判断一个括号字符串是否有效|2037

本文涉及知识点 数学 括号匹配 LeetCode2116. 判断一个括号字符串是否有效 一个括号字符串是只由 ‘(’ 和 ‘)’ 组成的 非空 字符串。如果一个字符串满足下面 任意 一个条件&#xff0c;那么它就是有效的&#xff1a; 字符串为 (). 它可以表示为 AB&#xff08;A 与 B 连接…

计算机毕业设计Python+CNN卷积神经网络考研院校推荐系统 考研分数线预测 考研推荐系统 考研爬虫 考研大数据 Hadoop 大数据毕设 机器学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

仿真设计|基于51单片机的温室环境监测调节系统

目录 具体实现功能 设计介绍 51单片机简介 资料内容 仿真实现&#xff08;protues8.7&#xff09; 程序&#xff08;Keil5&#xff09; 全部内容 资料获取 具体实现功能 &#xff08;1&#xff09;LCD1602液晶第一行显示当前的光照值及二氧化碳浓度值&#xff0c;第二…

智慧园区如何利用智能化手段提升居民幸福感与环境可持续性

内容概要 在当今社会&#xff0c;随着城市化进程的加快&#xff0c;智慧园区作为一种新兴的城市管理模式&#xff0c;逐渐获得了人们的关注。智慧园区不仅仅是物理空间的规划&#xff0c;更是一种通过智能化手段提升居民幸福感与环境可持续性的综合解决方案。本段将对智慧园区…

Android --- CameraX讲解

预备知识 surface surfaceView SurfaceHolder surface 是什么&#xff1f; 一句话来说&#xff1a; surface是一块用于填充图像数据的内存。 surfaceView 是什么&#xff1f; 它是一个显示surface 的View。 在app中仍在 ViewHierachy 中&#xff0c;但在wms 中可以理解为…

NLP深度学习 DAY5:Sequence-to-sequence 模型详解

Seq2Seq&#xff08;Sequence-to-Sequence&#xff09;模型是一种用于处理输入和输出均为序列任务的深度学习模型。它最初被设计用于机器翻译&#xff0c;但后来广泛应用于其他任务&#xff0c;如文本摘要、对话系统、语音识别、问答系统等。 核心思想 Seq2Seq 模型的目标是将…

Java锁自定义实现到aqs的理解

专栏系列文章地址&#xff1a;https://blog.csdn.net/qq_26437925/article/details/145290162 本文目标&#xff1a; 理解锁&#xff0c;能自定义实现锁通过自定义锁的实现复习Thread和Object的相关方法开始尝试理解Aqs, 这样后续基于Aqs的的各种实现将能更好的理解 目录 锁的…

基于STM32的阿里云智能农业大棚

目录 前言&#xff1a; 项目效果演示&#xff1a; 一、简介 二、硬件需求准备 三、硬件框图 四、CubeMX配置 4.1、按键、蜂鸣器GPIO口配置 4.2、ADC输入配置 4.3、IIC——驱动OLED 4.4、DHT11温湿度读取 4.5、PWM配置——光照灯、水泵、风扇 4.6、串口——esp8266模…

【游戏设计原理】96 - 成就感

成就感是玩家体验的核心&#xff0c;它来自完成一件让自己满意的任务&#xff0c;而这种任务通常需要一定的努力和挑战。游戏设计师的目标是通过合理设计任务&#xff0c;不断为玩家提供成就感&#xff0c;保持他们的参与热情。 ARCS行为模式&#xff08;注意力、关联性、自信…

MySQL CTE:解锁SQL查询新模式

目录 一、CTE 初相识 二、CTE 基础语法 &#xff08;一&#xff09;基本语法结构 &#xff08;二&#xff09;语法规则详解 三、非递归 CTE 应用实例 &#xff08;一&#xff09;单 CTE 简单查询 &#xff08;二&#xff09;多 CTE 联合查询 四、递归 CTE 深入探索 &…

C#,入门教程(12)——数组及数组使用的基础知识

上一篇&#xff1a; C#&#xff0c;入门教程(11)——枚举&#xff08;Enum&#xff09;的基础知识和高级应用https://blog.csdn.net/beijinghorn/article/details/123917587https://blog.csdn.net/beijinghorn/article/details/123917587 数组是一种数据集合&#xff0c;是一组…

【leetcode练习·二叉树】计算完全二叉树的节点数

本文参考labuladong算法笔记[拓展&#xff1a;如何计算完全二叉树的节点数 | labuladong 的算法笔记] 如果让你数一下一棵普通二叉树有多少个节点&#xff0c;这很简单&#xff0c;只要在二叉树的遍历框架上加一点代码就行了。 但是&#xff0c;力扣第第 222 题「完全二叉树的…

低代码系统-产品架构案例介绍、轻流(九)

轻流低代码产品定位为零代码产品&#xff0c;试图通过搭建来降低企业成本&#xff0c;提升业务上线效率。 依旧是从下至上&#xff0c;从左至右的顺序 名词概述运维层底层系统运维层&#xff0c;例如上线、部署等基础服务体系内置的系统能力&#xff0c;发消息、组织和权限是必…

对顾客行为的数据分析:融入2+1链动模式、AI智能名片与S2B2C商城小程序的新视角

摘要&#xff1a;随着互联网技术的飞速发展&#xff0c;企业与顾客之间的交互方式变得日益多样化&#xff0c;移动设备、社交媒体、门店、电子商务网站等交互点应运而生。这些交互点不仅为顾客提供了便捷的服务体验&#xff0c;同时也为企业积累了大量的顾客行为数据。本文旨在…

MSA Transformer

过去的蛋白质语言模型以单个序列为输入&#xff0c;MSA Transformer以多序列比对的形式将一组序列作为输入。该模型将行和列注意力交织在输入序列中&#xff0c;并在许多蛋白质家族中使用mask语言建模目标进行训练。模型的性能远超过了当时最先进的无监督学习方法&#xff0c;其…

QT实现有限元软件操作界面

本系列文章致力于实现“手搓有限元&#xff0c;干翻Ansys的目标”&#xff0c;基本框架为前端显示使用QT实现交互&#xff0c;后端计算采用Visual Studio C。 本篇将二维矩形截面梁单元&#xff08;Rect_Beam2D2Node&#xff09;组成的钢结构桥作为案例来展示软件功能。 也可以…