SwanLab:从本地实验管理到云端协作的AI开发实践

news2026/5/7 7:35:37
1. 项目概述从SwanHub到SwanLab一个实验管理工具的进化之路如果你在深度学习的项目里摸爬滚打过一段时间大概率会和我有同样的感受实验管理这事儿太乱了。模型改了一版又一版超参数调了无数次每次跑出来的日志、指标、图表散落在各个角落想对比一下不同实验的效果得翻好几个文件夹甚至自己都记不清哪个配置对应哪个结果。这种混乱不仅影响效率更关键的是它让整个研究或开发过程变得不可复现、难以追溯。几年前为了解决这个问题我接触到了SwanHub。它本质上是一个实验跟踪与协作平台你可以把它想象成一个专为AI实验设计的“GitHub”。你把代码、数据、环境配置和训练日志“推送”上去它帮你记录每一次实验的完整上下文包括超参数、代码版本、系统指标GPU/CPU使用率以及最重要的——训练过程中的损失、准确率等指标曲线。团队成员可以清晰地看到谁在做什么实验结果如何极大地提升了协作效率和实验的可复现性。而SwanLab正是SwanHub生态中面向开发者的核心开源组件。如果说SwanHub是那个功能齐全的云端协作平台那么SwanLab就是让你能在自己本地或任何服务器上轻松搭建起同样强大实验跟踪能力的“瑞士军刀”。它是一个轻量级、可嵌入的Python库让你无需依赖任何外部服务就能在代码中实现专业的实验日志记录、可视化与管理。这个从平台服务到开源工具的演进反映了一个清晰的趋势将核心能力下放赋予开发者更大的灵活性和控制权。今天我们就来深度拆解SwanLab看看它如何以极简的API解决实验管理中的核心痛点。2. 核心设计理念与架构解析2.1 为什么需要独立的实验管理库在SwanLab出现之前我们管理实验无非几种方式手动记录在Excel或文本文件里用TensorBoard、Weights Biases (WB) 或MLflow这类第三方服务或者自己写一套简陋的日志系统。手动记录效率低下且易出错TensorBoard功能强大但偏向可视化在实验对比、超参数搜索和团队协作上略显不足WB和MLflow非常优秀但它们通常是云端服务或需要自建服务器对于追求轻量化、高可控性或者处于内网环境的项目来说可能不是最理想的选择。SwanLab的设计目标非常明确极简集成、本地优先、数据驱动。它不希望成为你项目中的一个“庞然大物”而是像一个得力的助手用几行代码无缝融入你的训练循环。它的架构是典型的分层设计记录层Logging API这是开发者直接交互的部分提供像swanlab.log这样简单的函数用于记录标量、图像、文本等任何你想跟踪的数据。运行时层Run Management负责在本地创建和管理独立的“实验运行Run”。每次你初始化一个SwanLab记录器它就会在指定目录下创建一个新的文件夹用于存放该次实验的所有元数据、日志文件和生成的可视化图表。可视化与查询层DashboardSwanLab内置了一个轻量级的Web服务器。当你启动它时它会自动扫描日志目录并生成一个类似TensorBoard的交互式看板。你可以在这里实时查看指标曲线、对比不同实验、筛选超参数所有操作都在本地浏览器中完成无需网络连接。这种架构的优势在于解耦。记录层足够简单不会对训练代码造成性能负担运行时层将每次实验原子化保证了数据的隔离性可视化层则提供了统一的数据消费入口。整个流程自包含从记录到查看形成了一个完美的闭环。2.2 与SwanHub的协同生态理解SwanLab绝不能脱离其母体SwanHub。它们共同构成了一个从本地到云端、从个人到团队的完整工作流。你可以这样理解它们的关系SwanLab是“记录仪”和“本地看板”你在自己的机器上训练模型使用SwanLab进行日志记录和实时监控。所有数据首先落地在本地你拥有完整的所有权和隐私性。SwanHub是“云端仓库”和“协作中心”当你需要备份实验、与团队分享成果或者进行长期的实验归档时你可以将SwanLab本地生成的实验数据一键“推送”到SwanHub平台。在SwanHub上实验数据会被结构化存储并提供更强大的对比分析、报告生成和团队讨论功能。这种设计带来了巨大的灵活性。对于个人快速实验或敏感数据研究你可以完全使用SwanLab的本地模式。当项目进入团队协作阶段或需要持久化存档时再无缝对接SwanHub。这种“本地开发云端协同”的模式很好地平衡了便利性与可控性。注意虽然SwanLab可以独立使用但为了获得最佳的长期管理体验尤其是涉及超参数搜索产生数十上百个实验时将其与SwanHub结合使用能发挥出“112”的效果。云端平台提供的全局搜索、条件筛选和可视化对比是本地文件浏览器无法比拟的。3. 快速上手指南五分钟集成到你的训练脚本理论说了这么多不如动手试一下。SwanLab的集成简单到令人发指。我们以一个经典的PyTorch图像分类训练循环为例。3.1 安装与初始化首先通过pip安装pip install swanlab接下来在你的训练脚本开头初始化一个SwanLab运行Run。这通常在设置了所有超参数之后进行。import swanlab import torch import torch.nn as nn import torch.optim as optim # 定义你的超参数 config { learning_rate: 0.001, batch_size: 32, epochs: 50, model_name: resnet18, dataset: CIFAR-10, } # 初始化SwanLab运行 run swanlab.init( experiment_namemy_first_cifar10_experiment, # 实验名称 descriptionTrying ResNet18 with Adam optimizer, # 实验描述 configconfig, # 记录超参数配置 logdir./swanlog, # 日志存储目录默认是 ./swanlog )swanlab.init这行代码执行后几件事会同时发生在./swanlog目录下会创建一个以时间戳和实验名命名的子文件夹例如20240515_102030_my_first_cifar10_experiment。该文件夹内会生成一个config.yaml文件完整保存了你传入的config字典。这是实验可复现性的关键。一个用于实时传输日志数据的后台进程被启动。3.2 在训练循环中记录指标现在你可以像平时一样编写训练循环只需在关键位置插入swanlab.log函数。# 模拟训练循环 for epoch in range(config[epochs]): model.train() running_loss 0.0 running_correct 0 for batch_idx, (data, target) in enumerate(train_loader): # ... 前向传播、计算损失、反向传播等标准步骤 ... loss criterion(output, target) optimizer.zero_grad() loss.backward() optimizer.step() running_loss loss.item() _, predicted output.max(1) running_correct predicted.eq(target).sum().item() # 计算本epoch的平均损失和准确率 epoch_loss running_loss / len(train_loader) epoch_acc running_correct / len(train_loader.dataset) # **核心记录指标到SwanLab** swanlab.log({ train/loss: epoch_loss, train/accuracy: epoch_acc, epoch: epoch, # 也可以记录epoch数方便在图表横轴切换 }) # 在验证集上评估 model.eval() val_loss, val_acc evaluate(model, val_loader, criterion) swanlab.log({ val/loss: val_loss, val/accuracy: val_acc, }) # 甚至可以记录一些中间结果比如特定层的权重分布直方图 if epoch % 10 0: for name, param in model.named_parameters(): if weight in name and conv in name: swanlab.log({fweights/{name}: param.data.cpu().numpy()}) print(fEpoch {epoch}: Train Loss: {epoch_loss:.4f}, Val Acc: {val_acc:.4f})swanlab.log接受一个字典键是指标的名称值可以是标量数字、图像PIL Image / NumPy array / Matplotlib figure、文本甚至是音频数据。通过使用/分隔符如train/lossSwanLab的看板会自动将指标分组让图表更加清晰。3.3 启动看板并查看结果训练脚本运行后日志数据会实时写入本地文件。要查看可视化结果你需要在另一个终端窗口启动SwanLab看板服务swanlab watch ./swanlog执行命令后它会输出一个本地URL通常是http://localhost:5092。用浏览器打开这个地址你就能看到一个实时更新的仪表盘。左侧是所有实验的列表点击任何一个右侧就会展示该实验的所有记录指标并以精美的曲线图呈现。你可以同时勾选多个实验它们的曲线会叠加在同一张图中方便直观对比。实操心得我习惯在训练脚本所在的目录直接运行swanlab watch .。SwanLab会自动递归查找当前目录及子目录下所有的SwanLab日志文件夹非常方便。如果你在云服务器上训练可以通过SSH端口转发ssh -L 5092:localhost:5092 userserver在本地浏览器查看远程服务器上的看板。4. 核心功能深度解析与高级用法4.1 超参数记录与实验对比SwanLab不仅记录指标更重要的是它完整地捕获了实验的“上下文”——即超参数。在swanlab.init时传入的config字典会被永久保存。在看板界面上有一个专门的“超参数”面板以清晰的表格形式展示。当你进行了多次实验例如调整学习率或批大小SwanLab看板的强大之处就显现出来了。你可以在表格视图中根据超参数的值进行筛选和排序。比如快速找出所有learning_rate0.001且batch_size64的实验然后对比它们的验证准确率曲线。这种基于超参数的实验对比是手动管理时代难以实现的高效操作。高级技巧对于复杂的超参数搜索例如使用Optuna或Ray Tune你可以在每次实验的config中包含搜索算法的相关信息如trial_id,search_space等。这样在看板上你不仅能对比结果还能分析搜索过程的有效性。4.2 多媒体与自定义数据记录除了标量SwanLab对多媒体数据的支持是其一大亮点这对于计算机视觉、语音合成等领域至关重要。记录图像在目标检测任务中你可以在验证阶段记录带有预测框的图像。import matplotlib.pyplot as plt import swanlab # 假设我们有一张图片和其预测结果 fig, ax plt.subplots() ax.imshow(image) # ... 在ax上绘制预测框 ... swanlab.log({validation/prediction: fig}) # 直接传入matplotlib figure对象 plt.close(fig) # 记得关闭避免内存泄漏在看板上这些图像会按步骤step或epoch排列你可以像翻相册一样查看模型在每个阶段的输出效果直观判断模型是进步了还是出现了过拟合。记录文本对于NLP任务可以记录模型生成的文本样例。generated_text model.generate(input_ids) swanlab.log({samples/epoch_{}.format(epoch): generated_text})记录音频对于语音任务可以记录原始音频、生成音频或增强后的音频进行对比。import numpy as np swanlab.log({audio/clean: clean_audio_array, audio/noisy: noisy_audio_array})注意事项频繁记录高分辨率图像或长音频会显著增加日志文件大小并可能影响训练速度。建议仅在关键检查点如每N个epoch或验证集上最佳表现时记录此类数据。对于图像也可以先调整到合适尺寸再记录。4.3 实验分组、标签与搜索当实验数量爆炸式增长后如何组织它们就成了新问题。SwanLab提供了实验分组Group和标签Tag功能。分组你可以在swanlab.init时指定group参数。例如所有关于“数据增强策略探索”的实验可以归为一组。在看板中可以按组折叠或展开让界面保持整洁。run swanlab.init(experiment_nameexp_aug_colorjitter, groupdata_augmentation_study, configconfig)标签标签是更灵活的元数据。你可以为实验打上多个标签如baseline,high_lr,failed,best_model。之后可以通过标签快速过滤实验。标签可以在初始化时设置也可以在实验中途通过API添加。run.tag([exploratory, transformer_arch]) if val_acc 0.95: run.tag(sota_candidate)结合超参数过滤和标签搜索你就能在海量实验中瞬间定位到感兴趣的那几个极大提升了研究管理的效率。5. 生产环境集成与团队协作实践5.1 与分布式训练框架结合在分布式数据并行DDP训练中通常有多个进程同时运行。如果每个进程都初始化一个SwanLab Run并写入同一个目录会导致冲突。SwanLab优雅地处理了这种情况。推荐的做法是仅在全局主进程local_rank 0中进行初始化和日志记录。其他进程的日志操作会被自动忽略或聚合到主进程。import torch.distributed as dist import swanlab def setup_for_distributed(is_master): 仅在主进程初始化SwanLab if is_master: run swanlab.init( experiment_nameddp_training, configconfig, ) return run else: return None # 在你的DDP设置代码中 if dist.get_rank() 0: swanlab_run setup_for_distributed(True) else: swanlab_run setup_for_distributed(False) # 在训练循环中记录前判断 if dist.get_rank() 0 and swanlab_run is not None: swanlab.log({train/loss: avg_loss})这样所有GPU上的指标如损失在通过torch.distributed.all_reduce等操作同步后由主进程统一记录一次保证了日志的整洁和正确性。5.2 自动化流水线与持续集成在成熟的MLOps流水线中模型训练往往是由代码提交、数据更新等事件自动触发的。SwanLab可以很好地集成到这类自动化流程中。例如在GitLab CI/CD或GitHub Actions的配置文件中你可以在训练任务完成后添加一个步骤将本次实验的关键结果如最终测试精度、模型文件大小以及指向SwanLab看板的链接以评论的形式自动提交到对应的Merge Request或Issue中。# GitHub Actions 示例片段 - name: Run Training and Log to SwanLab run: | python train.py --config configs/ci_config.yaml - name: Summarize Experiment and Comment on PR if: github.event_name pull_request run: | # 解析SwanLab生成的最新实验的最终指标 FINAL_ACC$(python parse_swanlog.py ./swanlog --metric val/accuracy --last) SWANLAB_URLhttp://your-ci-server:5092 # 假设看板在CI服务器上运行 # 使用GitHub API将结果评论到PR curl -X POST -H Authorization: token ${{ secrets.GITHUB_TOKEN }} \ -d {\body\: \✅ 自动化训练完成最终验证准确率: ${FINAL_ACC:.4f}\\n 详细训练曲线请查看: ${SWANLAB_URL}\} \ https://api.github.com/repos/${{ github.repository }}/issues/${{ github.event.pull_request.number }}/comments这种实践将实验跟踪直接嵌入开发流程让每一次代码变更带来的模型性能影响都清晰可见促进了团队的技术沟通和决策。5.3 与SwanHub云端同步对于团队项目最终往往需要将本地实验同步到SwanHub进行永久归档和知识沉淀。操作非常简单首先在SwanHub官网注册并创建一个项目。在本地安装SwanHub CLI并登录pip install swanhub swanhub login。进入你的实验日志目录使用swanhub push命令。cd ./swanlog/20240515_102030_my_experiment swanhub push --project your-username/your-project-name命令执行后该次实验的所有数据配置、指标、图表、记录的图像/文本等都会被上传到你在SwanHub上的项目页面。团队成员可以通过网页链接直接访问无需在本地启动看板服务。个人体会我通常的工作流是在本地用SwanLab进行快速的迭代和调试因为本地看板的响应速度最快。当一个实验系列例如一组超参数搜索完成并且得到了有意义的结论后我会将整个系列推送到SwanHub。在SwanHub上撰写一份简短的实验报告Markdown格式总结发现、附上最佳模型并相关同事进行review。这样个人的探索性工作就转化为了团队共享的、结构化的知识资产。6. 常见问题排查与性能优化技巧即使工具设计得再优雅在实际使用中还是会遇到各种问题。下面是我在长期使用SwanLab过程中积累的一些“避坑指南”。6.1 日志记录相关的问题问题1训练脚本崩溃后看板中最后的指标点丢失或曲线中断。原因SwanLab默认采用异步、缓冲的方式写入日志以提高性能。如果程序突然崩溃缓冲区中尚未写入磁盘的数据就会丢失。解决方案对于非常关键的指标如每个epoch结束时的验证精度可以使用swanlab.log(..., flushTrue)参数强制立即写入磁盘。但需谨慎使用因为频繁刷盘会影响性能。更好的做法是确保训练循环有良好的异常捕获机制在发生异常时主动调用swanlab.finish()或确保程序正常退出。问题2记录的图像在看板上显示为空白或扭曲。原因通常是因为传入的图像数据格式不符合预期。SwanLab支持多种格式NumPy数组、PIL Image、Matplotlib Figure但每种格式都有其要求如NumPy数组的维度顺序应是HWC值范围在[0, 255]或[0, 1]。排查步骤检查数组的shape和dtype。对于RGB图像shape应为(高度, 宽度, 3)。如果使用Matplotlib确保在log之后调用plt.close(fig)否则可能因为图形对象被提前销毁而导致问题。可以先尝试记录一个非常简单的、自生成的图像如纯色图片来测试流程是否正确。6.2 性能与资源使用问题训练速度变慢怀疑是SwanLab日志记录导致的。分析SwanLab本身非常轻量开销主要来自两方面1) 日志数据的序列化和磁盘写入2) 记录高频、大体积数据如每批都记录高分辨率图像。优化策略降低记录频率不要在每个batch都记录损失。可以每N个batch或每个epoch记录一次平均损失。精简记录内容只记录关键指标。调试阶段的中间变量可以在代码中用普通print输出而非全部通过SwanLab记录。压缩图像数据在记录图像前使用PIL.Image的thumbnail方法或cv2.resize将其缩放到合适的尺寸如512x512。对于训练过程监控这个分辨率通常足够了。使用更快的存储将logdir指向SSD硬盘而非网络挂载盘或慢速HDD。异步记录SwanLab默认就是异步的确保你没有因为错误使用而阻塞了主线程。6.3 看板使用与数据管理问题看板加载缓慢尤其是实验数量很多时。原因SwanLab看板在启动时需要扫描并索引所有实验目录下的日志文件。如果实验数量成百上千且每个实验都记录了大量的数据点或图像初始化加载就会变慢。解决方案按需加载使用swanlab watch ./swanlog/specific_experiment只加载特定实验。归档旧实验对于已经完结且不再需要频繁查看的旧实验可以将其目录移动到logdir之外的其他地方进行归档。看板只会扫描logdir及其子目录。清理日志文件定期检查logdir删除那些因调试产生的、无价值的失败实验目录。问题误操作删除了本地日志目录如何恢复预防优于恢复这强调了与SwanHub云端同步的重要性。定期将重要的实验推送到SwanHub就是最好的备份。可能的恢复如果训练程序仍在运行SwanLab会持续向日志文件写入数据。立即停止程序或许能从文件系统中恢复部分数据但这依赖于具体系统和文件系统不保证成功。对于已结束的实验如果本地删除且未同步到云端数据将永久丢失。因此建立规范的数据管理习惯至关重要。7. 总结与最佳实践建议经过一段时间的深度使用SwanLab已经成为了我个人和团队机器学习项目中不可或缺的基础设施。它用极低的接入成本换来了实验管理质量的巨大提升。回顾整个使用历程我总结出以下几点最佳实践或许对你有帮助1. 配置即代码代码即配置。始终通过config字典将所有超参数传递给swanlab.init。即使是那些你认为不会变的默认值也显式地写进去。这保证了任何一次实验只要拿着这个配置文件和对应的代码版本就一定能复现。我习惯将配置单独存为一个config.yaml文件在训练脚本中加载它并传给SwanLab这样配置管理更清晰。2. 建立清晰的命名与分组规范。实验名experiment_name最好能包含关键信息如{model}_{dataset}_{lr}_{date}例如vit-b16_cifar100_lr1e-4_0515。同时积极使用group来组织相关实验系列。一个清晰的命名规范在看板列表和日后查找时能节省大量时间。3. 记录“为什么”而不仅仅是“是什么”。除了冰冷的数字利用description字段或记录文本日志swanlab.log({note: ...})来写下你这次实验的动机、观察到的现象、遇到的奇怪问题以及你的猜想。这些文字信息在几周或几个月后回顾时价值远超那些曲线图。SwanLab看板支持在实验详情页显示这些文本记录。4. 本地探索云端归档。充分利用SwanLabSwanHub的混合模式。在本地进行快速迭代和调试享受零延迟的看板体验。当一个研究方向或项目阶段告一段落时精选出有代表性的实验包括成功的和失败的推送到SwanHub。在云端项目页面中整理实验报告形成团队的知识库。失败的实验和成功的实验同样重要它们定义了问题的边界。5. 将实验跟踪作为代码的一部分。不要事后补录。在项目一开始就把SwanLab的初始化代码写好。把它当作像import torch一样的基础设施。这样你从第一个实验开始所有轨迹都被自动捕获避免了后期整理历史数据的痛苦。工具的价值在于融入工作流。SwanLab的成功之处在于它没有试图改变你原有的编码习惯而是像一层薄薄的润滑剂让“实验管理”这个原本繁琐的过程变得自动化、可视化、可协作。从今天开始尝试在你的下一个训练脚本里加上那几行初始化代码你很快就会发现混乱的实验日志文件夹将成为历史。

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

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

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…