news 2026/9/6 9:18:14

最简单的GPU平台怎么选?从开机到跑通模型的完整指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
最简单的GPU平台怎么选?从开机到跑通模型的完整指南

从第一次开机到跑通模型:聊聊部署最简单的GPU平台怎么选、怎么用

搞AI这几年,我最大的感受是:模型训练和推理的瓶颈早就不在算法上,而在环境搭建和硬件管理上。尤其是GPU,一开机就面对驱动不兼容、CUDA版本对不上、PyTorch装完跑不起来这些破事,真的会让人瞬间失去热情。所以当有人问我“想部署最简单的GPU平台,有哪些推荐的服务提供商”时,我特别能理解这个问题的分量。

这个问题的关键词其实是“最简单”——不是性能最强,不是性价比最高,而是从你付款到模型第一次输出结果,中间走过的弯路最少。这篇文章我打算完整梳理一遍:哪些GPU服务商适合新手和中小团队、第一次开机后要做什么、怎么把环境从零搭到能跑模型,以及我在实操中踩过的那些坑。无论你是刚接触深度学习的学生,还是想快速验证业务方案的工程师,这篇文章都能帮你省下至少一个周末。

1. 内容整体设计与思路拆解

1.1 “最简单的GPU平台”到底指什么

很多人选GPU平台的时候,习惯性地先看显卡型号和价格,这其实是个误区。“最简单”这三个字,应该包含三层含义:

第一层是获取简单。不需要你自己买显卡、装机器、搞散热和供电,打开网页注册账号、选配置、付款,几分钟内就能拿到一台带GPU的服务器。这一层所有主流云厂商都能做到。

第二层是环境简单。拿到机器之后,GPU驱动、CUDA工具包、深度学习框架这些基础环境,是已经帮你装好了,还是需要你自己从头折腾?这一点才是拉开差距的地方。我见过太多人在这一步浪费两三天时间,就为了把驱动和CUDA版本对齐。

第三层是使用简单。日常的开关机、镜像保存、数据上传、日志查看这些操作,有没有一个友好的控制台界面,还是说必须敲一堆命令行?对于不熟悉Linux的人来说,这一步的体验差异非常大。

所以我在给朋友推荐的时候,从来不说“哪个牌子最牛”,而是说“哪个平台能让你把精力花在模型上,而不是花在运维上”。明白了这个逻辑,后面的选择就好做了。

1.2 服务商推荐:主流GPU平台对比

目前市面上的GPU平台,按使用方式基本可以分为三类:传统云厂商、GPU容器平台和国内专用算力平台。我挑几个有代表性的,给出我的真实使用感受。

平台优势不足适合人群
AWS EC2 P系列生态完善,文档巨多,全球节点新用户操作复杂,价格偏高企业级用户,已有AWS使用经验
Azure N系列与微软生态集成好,企业合规强界面相对繁琐,GPU库存经常紧张微软系技术栈的团队
Google Cloud GPUTPU/GPU共存,科研机构用得多国内访问不稳定科研合作项目
阿里云GPU云服务器中文文档全,有免费试用额度长期包月价格偏高国内团队,需要稳定和合规
AutoDL价格便宜,开箱即用,社区活跃大规格实例偏少,不适合超大规模训练个人开发者、学生、AI初学者
青椒云按小时计费灵活,镜像市场丰富品牌知名度相对较低临时需要GPU跑任务的用户

这里我特别多说一句AutoDL。它虽然不是传统意义上“大厂”,但在“最简单”这件事上做得非常出色。它的镜像系统把CUDA、cuDNN、PyTorch这些环境全部预装好了,你选择的每个镜像都是经过验证能跑的,几乎不存在“环境装到一半崩了”的情况。对于只想跑通模型、不想折腾环境的人来说,这种体验真的很舒服。

1.3 为什么我建议你从“租用”而不是“自建”开始

前阵子有个朋友兴致勃勃地告诉我,他花了两万块钱自己攒了一台双卡机器,结果第一次开机就遇到显卡不识别的问题,折腾了一周才发现是主板BIOS设置的问题。这种事在实际中太常见了。

自建GPU机器的成本远不止硬件本身。你需要考虑电源功率是否足够、散热方案是否可靠、机箱能不能装下三风扇的超大显卡、主板PCIe通道是否够用,甚至还要考虑家里或公司的电费。这些隐形成本汇总起来,往往比直接租用云GPU还要贵。

而租用GPU平台的好处在于:你不用关心硬件生命周期,坏了平台会换;你不用操心驱动兼容性,镜像帮你处理好;你用多少付多少,不需要的时候关掉就不计费。我个人的建议是:除非你有长期稳定的训练需求且对数据安全有极高要求,否则第一次尝试GPU部署,优先选择租用平台。

2. 核心细节解析与实操要点

2.1 第一次开机:你需要注意的3个关键选项

当你注册好账号,准备创建第一台GPU实例时,会遇到几个关键选项。这些选项选对了,后面一路顺畅;选错了,可能就得反复重装系统。

第一个是计费模式。大部分平台提供按量计费和包月计费两种方式。按量计费适合短期测试和间歇性使用,包月适合长时间持续训练。如果你只是跑跑demo、验证一下思路,我强烈建议先按量计费,等确认需求稳定了再切换成包月。很多平台新用户有优惠券,别浪费。

第二个是区域选择。GPU资源在某些热门区域经常缺货,但你不要因此随便选一个偏远区域。想想你的数据从哪里上传——如果你的数据在本地,而服务器在另一个大洲,传输速度会让人崩溃。正确的做法是:选择离你最近、且有余量的区域,最好同时考虑一下平台是否有内网数据传输服务。

第三个是镜像选择。这是“最简单”和“最痛苦”的分水岭。记住一个原则:优先选择带深度学习环境的官方镜像,而不是从裸操作系统开始安装。以我常用的平台为例,镜像列表里通常有PyTorch、TensorFlow、Miniconda等预装选项,选PyTorch镜像就意味着你已经拥有了Python、PyTorch、CUDA、cuDNN的完整环境。我见过太多人从Ubuntu裸机开始装,结果光装驱动就花了一整天。

2.2 登录服务器:使用SSH连接你的第一台GPU机器

创建好实例之后,你会在控制台看到一个公网IP地址,以及平台的登录密码或者密钥。接下来要做的,就是通过SSH连接到这台服务器。

Windows用户无需额外安装软件,直接在命令行里输入ssh root@你的IP地址即可。如果你使用的是Mac或Linux,操作完全相同。第一次连接时会提示你确认主机指纹,输入yes继续,然后输入密码或选择密钥文件就能登录。

这里有一个非常实用的建议:强烈建议你在第一次登录后就配置SSH密钥登录,之后就不需要每次都输入密码了。在本地终端执行ssh-keygen -t rsa生成密钥对,然后用ssh-copy-id root@你的IP地址把公钥上传到服务器。整个过程不到一分钟,但之后你每次连接都会觉得舒服很多。

连接成功之后,第一件事不是急着装东西,而是先确认GPU是否被系统正确识别。执行nvidia-smi命令,如果能看到显卡型号、显存大小、驱动版本和CUDA版本,恭喜你,最难的环节已经过去了。

2.3 确认GPU状态:读懂nvidia-smi的输出

很多新手第一次执行nvidia-smi,看到满屏的表格和数字会有点懵。其实这个命令的输出信息非常清晰,拆开来看就三部分:

上面部分是驱动信息和GPU总览,包括驱动版本、CUDA版本、以及每张显卡的名称、温度、功耗、显存使用情况。中间部分是当前正在使用GPU的进程列表。如果你的机器上还没有跑任何程序,这部分通常是空的。下面部分是性能状态,包含显卡的利用率、显存使用率、温度等实时数据。

我这边的建议是:在正式开始工作之前,把watch -n 1 nvidia-smi命令记住。它的作用是每隔1秒自动刷新一次GPU状态,让你实时看到训练时显卡的利用率和显存占用。如果你发现GPU利用率一直是0%,说明你的代码可能压根没用上GPU,这是在初学阶段最常见的错误。

3. 实操过程与核心环节实现

3.1 环境检查:验证CUDA和深度学习框架是否正常

假设你选择了预装PyTorch的镜像,登录后的第一件事,是打开Python环境,验证PyTorch能否正确调用GPU。别小看这一步,它能在你写正式代码之前,把所有环境问题暴露出来。

在终端中输入python进入Python交互环境,然后依次执行:

import torch print(torch.__version__) print(torch.cuda.is_available()) print(torch.cuda.device_count()) print(torch.cuda.get_device_name(0))

如果你看到的输出是类似2.1.0+cu118True1NVIDIA GeForce RTX 4090这样的内容,说明环境完全正常。但如果torch.cuda.is_available()返回False,那就说明PyTorch和CUDA之间的衔接出了问题,这个问题我们后面会专门讲。

这里有一个新手特别容易犯的错误:在验证GPU可用时只看torch.cuda.is_available(),却忽略了torch.cuda.get_device_name(0)这一行。我建议你把输出完整截图留下来,这不仅是对环境的确认,后面如果遇到问题,这些信息也是排查的重要依据。

3.2 安装PyTorch:用官方命令,别自己瞎折腾

如果你的镜像里没有预装PyTorch,或者你想安装一个特定版本,这时候需要用官方给出的安装命令。很多人习惯自己去网上搜“PyTorch安装教程”,结果装出了各种奇怪的版本组合,最后代码跑不起来。

正确的做法是访问PyTorch官网,选择你的操作系统、包管理器、CUDA版本,然后复制它生成的命令行指令。比如在Linux系统下,使用pip安装支持CUDA 11.8的PyTorch,命令通常是:

pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

注意这里的关键是--index-url参数,它确保你安装的是支持GPU的版本,而不是默认的CPU版本。有一个小技巧是,如果你在国内,访问PyTorch官方源可能会很慢,这时候可以加上-i参数换成国内镜像源,比如清华源:

pip3 install torch torchvision torchaudio -i https://pypi.tuna.tsinghua.edu.cn/simple

但镜像源里默认的torch版本往往不包含CUDA支持,所以稳妥的做法是先按官方命令安装torch本体,其他依赖包用国内源加速。如果官方源太慢且清华源装不了GPU版,可以考虑用官方源加代理方式,或者直接使用平台预置的镜像。

3.3 跑通第一个模型:从最简单的张量运算开始

环境准备好之后,我建议不要直接跑什么大模型,而是从一个最简单的GPU张量运算开始。这样能最快地验证整体链路是否通畅。

打开Python交互环境,执行以下代码:

import torch from torch import nn # 创建一个在GPU上的张量 x = torch.randn(1000, 1000, device='cuda') w = torch.randn(1000, 1000, device='cuda') # 执行矩阵乘法 y = torch.matmul(x, w) print(f"计算结果形状: {y.shape}") print(f"计算结果设备: {y.device}") print(f"计算完成,一切正常!")

如果代码顺利输出三行结果,说明GPU的计算链路已经完全打通。这时候你可以在另一个终端输入watch -n 1 nvidia-smi,会发现GPU利用率跳到了某个值,显存也有占用,这说明你的操作确实跑在GPU上了。

3.4 跑通一个真实模型:以MNIST手写数字识别为例

张量运算能跑通,只说明环境没问题,但离“跑通模型”还有一步。下面我用一个非常经典的MNIST手写数字识别模型,带你完整体验从数据加载到模型训练的完整流程。

新建一个Python文件,命名为train_mnist.py,写入以下代码:

import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader # 1. 定义数据预处理 transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,)) ]) # 2. 加载数据集(首次运行会自动下载) train_dataset = datasets.MNIST('./data', train=True, download=True, transform=transform) test_dataset = datasets.MNIST('./data', train=False, download=True, transform=transform) train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True) test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False) # 3. 定义模型 class SimpleNet(nn.Module): def __init__(self): super(SimpleNet, self).__init__() self.conv1 = nn.Conv2d(1, 32, kernel_size=3, padding=1) self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1) self.fc1 = nn.Linear(64 * 7 * 7, 128) self.fc2 = nn.Linear(128, 10) def forward(self, x): x = torch.relu(self.conv1(x)) x = torch.max_pool2d(x, 2) x = torch.relu(self.conv2(x)) x = torch.max_pool2d(x, 2) x = x.view(x.size(0), -1) x = torch.relu(self.fc1(x)) x = self.fc2(x) return x # 4. 初始化模型并移动到GPU device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') model = SimpleNet().to(device) criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=0.001) # 5. 训练循环 def train(epoch): model.train() for batch_idx, (data, target) in enumerate(train_loader): data, target = data.to(device), target.to(device) optimizer.zero_grad() output = model(data) loss = criterion(output, target) loss.backward() optimizer.step() if batch_idx % 100 == 0: print(f'Epoch {epoch} | Batch {batch_idx} | Loss: {loss.item():.4f}') # 6. 测试函数 def test(): model.eval() correct = 0 with torch.no_grad(): for data, target in test_loader: data, target = data.to(device), target.to(device) output = model(data) pred = output.argmax(dim=1, keepdim=True) correct += pred.eq(target.view_as(pred)).sum().item() accuracy = 100. * correct / len(test_loader.dataset) print(f'Test Accuracy: {accuracy:.2f}%') # 7. 执行训练和测试 for epoch in range(1, 4): train(epoch) test()

运行python train_mnist.py,正常情况下你会看到训练日志开始滚动,每个epoch结束时输出测试准确率。我个人实测下来,在常见的GPU上跑3个epoch,准确率通常在97%到99%之间,整个训练过程不到两分钟。

这个例子包含了深度学习中最重要的几个环节:数据加载、模型定义、GPU迁移、训练循环、验证评估。把这段代码吃透,你就掌握了用GPU跑模型的基本功。之后无论是换更大的数据集,还是用预训练模型做微调,底层的逻辑都是一样的。

3.5 进阶实操:用Ollama部署大语言模型

说完传统的PyTorch训练,再说说现在更热门的方向——本地部署大语言模型。如果你只是想体验一下在GPU服务器上跑ChatGPT类的模型,用Ollama是最简单的方案。

Ollama是一个开源的本地大模型运行工具,它把模型下载、依赖管理、API服务全部封装好了。你只需要在终端执行:

curl -fsSL https://ollama.com/install.sh | sh

安装完成后,执行ollama run qwen2.5:7b就能拉起一个7B参数的中文模型。第一次运行会先下载模型文件,之后就能直接在终端里对话。Ollama还自带OpenAI兼容的API接口,启动后访问http://localhost:11434就能通过Python或其他客户端调用。

我特别推荐新手从Ollama开始体验大模型部署,因为它真的做到了零配置。唯一需要注意的问题是模型文件比较大,7B模型大概需要4到5GB的下载流量,建议确保自己的网络稳定。

4. 工具选型与方案对比

4.1 GPU驱动与CUDA版本:选错是最大的坑

GPU驱动和CUDA版本不一致,导致nvidia-smi能识别显卡但PyTorch无法使用GPU,这是我见过最多的问题。要理解这个问题,得先搞清楚CUDA的两个版本概念。

第一个是显卡驱动自带的CUDA版本,通过nvidia-smi查看。它表示这个驱动最高支持什么版本的CUDA运行时。第二个是深度学习框架依赖的CUDA版本,通过nvcc --version或者conda list | grep cuda查看。

这两个版本不需要完全一致,但框架依赖的CUDA版本不能高于驱动支持的版本。比如你的驱动显示CUDA Version: 12.2,那么PyTorch只要是用CUDA 12.x及以下版本编译的,都能正常运行。但如果驱动是11.8,你却安装了用CUDA 12.1编译的PyTorch,就会出现各种奇怪的报错。

避坑方法很简单:优先选择平台官方镜像,因为镜像里的组合都经过测试。如果非要自己装,那就遵循“驱动宁高勿低”的原则——先升级驱动到较新版本,再安装对应版本的PyTorch。

4.2 容器化部署:Docker在GPU场景中的优势

说到部署,就绕不开Docker。尤其是当你需要在不同机器之间迁移环境,或者想避免把服务器弄乱时,Docker的价值非常明显。

在GPU服务器上使用Docker,关键是要安装NVIDIA Container Toolkit。安装好之后,在运行容器时加上--gpus all参数,容器内就能直接访问GPU:

docker run --gpus all -it pytorch/pytorch:latest python -c "import torch; print(torch.cuda.is_available())"

这个命令会下载官方PyTorch镜像并测试GPU是否可用。如果你看到输出的结果是True,说明你的Docker GPU环境已经就绪。

Docker最大的好处是环境隔离和可复制性。你可以把训练环境打包成镜像,在另一台机器上直接运行,完全不用担心依赖冲突。我自己在生产环境部署模型服务时,标准做法就是把模型和推理代码做成Docker镜像,然后分发到各个GPU节点。

4.3 多GPU并行策略:单机多卡的用法

当你需要跑更大的模型,或者训练数据量很大时,单张显卡可能不够用。这时候你可能会用到多GPU并行。

深度学习框架提供了几种并行方案:DataParallel、DistributedDataParallel和模型并行。对于新手来说,最简单的是PyTorch内置的DataParallel。假设你有4张卡,只需在模型外面包一层:

model = nn.DataParallel(model) model.to(device)

PyTorch会自动把一个batch的数据切分到4张卡上分别计算,然后汇总梯度。这个方案代码改动最小,但效率不是最优的。对于追求性能的场景,更推荐DistributedDataParallel,它需要额外的进程初始化代码,但性能明显更好。

还有一个新手容易忽略的问题:多GPU任务怎么确认每张卡都在工作?我一般会在服务器上再开一个终端,运行watch -n 1 nvidia-smi,实时观察每张卡的显存和利用率。如果只有一张卡在动,其他卡不动,那就需要检查代码里的device设置,确保数据和模型都正确分配到了多卡环境。

4.4 模型微调:在有限资源下的训练技巧

很多朋友部署GPU平台,核心需求是微调大模型。微调和从头训练是完全不同的概念——微调是在预训练模型的基础上,用少量标注数据继续训练,让模型适配特定任务。

微调的过程并不复杂,关键在资源管理。常见做法是使用Hugging Face的Transformers库加载预训练模型,然后用LoRA等参数高效微调技术。LoRA的核心思路是冻结原有模型参数,只训练一小部分新增的矩阵参数,这样显存占用可以降低一个数量级。

如果你在微调时遇到显存不足的问题,除了使用LoRA,还可以从这几个方向入手:减小batch size、使用梯度累积、开启混合精度训练、使用DeepSpeed或bitsandbytes进行量化加载模型。这些技术在国内外的开源社区都有非常成熟的方案,搜索引擎搜一下就能找到对应工具的使用方法。

5. 常见问题与排查技巧实录

5.1 问题速查表:遇到报错直接对照

我在部署和使用GPU平台的过程中,遇到过不少问题。这里整理一个速查表,覆盖最常见的情况。

问题现象可能原因解决方案
nvidia-smi提示NVIDIA-SMI has failed驱动未安装或未加载重新安装NVIDIA驱动,重启服务器
PyTorch无法调用GPUCUDA版本与PyTorch不匹配按官方命令重装对应CUDA版本的PyTorch
训练时GPU利用率始终为0%数据和模型没有迁移到GPU检查代码中是否执行了.to(device).cuda()
显存不足OOMbatch size过大或模型过大减小batch size、使用梯度累积、开启混合精度
pip安装速度极慢默认源在国外使用国内镜像源,如清华源或阿里源
Docker容器内无法使用GPU缺少NVIDIA Container Toolkit安装并重启Docker服务
上传数据集到服务器很慢跨区域网络传输使用对象存储中转或选择就近区域

5.2 我踩过的坑:关于GPU崩溃和数据丢失的教训

最后分享几个我在实际使用中踩过的坑,希望能帮你绕开。

第一个是关于GPU crash dump triggered的问题。有一次我在训练一个较大的模型,突然看到这个提示,然后GPU利用率直接掉到0%,训练也停了。后来排查发现,这是因为显存超额使用导致驱动崩溃进入了保护模式。解决方法是降低batch size,或者使用CUDA_LAUNCH_BLOCKING=1环境变量来定位具体崩溃的代码行。强烈建议在训练前算一下显存需求:模型参数量乘以4字节乘以优化器系数,再加上激活值的占用,确保总需求不超过显存容量。

第二个坑是关于数据安全的。云服务器虽然方便,但也意味着你的数据存储在别人的机房。我的习惯是:重要数据在本地上传到平台前先加密压缩;训练好的模型权重及时下载到本地备份;在平台上创建的镜像可以做版本管理,保留最近几个稳定版本,避免误删。

第三个坑是关于平台的选择。同一个GPU型号在不同平台上的表现可能会有差异,这和各家的虚拟化方案、散热策略有关。建议在正式投入之前,先租一小段时间做基准测试,再决定是否长期使用。测试方法其实很简单:跑同一个模型,对比训练时间和显存表现即可。

6. 给新手的一条极简路径:从零到一直接抄作业

写到这里,我把整篇文章压缩成一个可直接执行的极简清单,你按顺序操作,就能用最短路径跑通GPU部署:

第一步:选择一个提供预装深度学习镜像的GPU平台(国内用户优先考虑AutoDL、阿里云这类操作简单的服务商),注册并完成实名认证。

第二步:创建GPU实例,选择带PyTorch的镜像,计费方式选按量计费。如果你不确定选什么镜像,默认选项通常就是最稳妥的。

第三步:SSH登录服务器,执行nvidia-smi确认GPU正常识别。

第四步:进入Python环境,执行前面那段验证代码,确认torch.cuda.is_available()为True。

第五步:把MNIST训练代码保存为train_mnist.py并运行,如果能正常训练并输出准确率,说明整条链路已经打通。

第六步:在此基础之上,根据自己的需求扩展:如果要部署大模型,安装Ollama并运行Qwen等模型;如果要微调模型,学习使用Hugging Face和LoRA;如果要部署服务,学习使用Docker容器化。

我个人在实际操作中的体会是:不要把部署过程想得太可怕,但也不要轻视环境问题。按照上面这套流程走,大部分人都能在半天之内完成从注册到跑通模型的全部过程。真正消耗时间的,往往是你自己给自己挖的那些坑——比如在驱动版本上较劲,或者非要从裸系统开始一步步手动装环境,回头再看这些弯路其实完全没有必要。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/6 9:17:22

单目视频人体质心估计:深度学习与稀疏融合技术解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/6 9:16:23

Ai大模型接入sdk day3

在进行大模型相关的开发测试时,直接将 API Key 写在代码里不仅不方便切换,还极易造成密钥泄露。最优雅且规范的做法是将 API Key 写入系统的环境变量中。本文将演示如何在 Linux 系统中统一配置和管理 DeepSeek、ChatGPT 以及 Gemini 等主流大模型的 API…

作者头像 李华
网站建设 2026/9/6 9:16:18

高速接口抖动分析:为何RJ/DJ分离是误码率达标的关键

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/6 9:16:15

51单片机存储结构:从内存映射到程序溢出排查的完整指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/6 9:14:14

通达信基本面副图指标源码详解:用FINANCE函数构建股票评分卡

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/6 9:13:40

OpenHarmony硬件调试三板斧:串口日志、在线调试与逻辑分析仪实战

做OpenHarmony硬件开发这段时间,经常被问到同一个问题:系统起不来、驱动不通、外设没反应,到底该怎么查?问的人越多,我越发现一个现象——很多新手工具其实都备齐了,可一到真出问题时,翻来覆去只…

作者头像 李华