cgroup threaded功能例子
一、背景
cgroup在如今的系统里基本都是默认打开的一个功能。对于cgroup的cpu子系统,默认的颗粒度是进程为维度进行cgroup的cpu及cpuset的控制。而对于一些复杂进程,可能的需求是进程里一些个别线程要绑定在X1-Xn这些cpu核上,而除了这些个别线程之外的其他线程都需要绑定在Y1-Yn这些cpu核上。对于进程颗粒度的需求,一般来说systemd的能力就覆盖到了,但是对于这种相对复杂的线程颗粒度的需求,我们其实可以有几种处理方法。比如:
1)通过cpulimit进行CPU限制
——这种方式不需要root权限,原理是通过周期性地暂停和恢复进程(发送SIGSTOP和SIGCONT信号)来间接限制CPU限制,这种方式相对不太正式,属于“调试性”的限制方案。
2)通过管理服务或线程自己调用api进行线程级别的绑核控制
——在进程完全启动之后,通过绑核的api(sched_setaffinity)进行绑核设置,这种方式管理方式只能控制绑核,控不了cpu限额。我们倒是可以用systemd的进程限额能力配合这个管理服务的线程绑核能力来缝合成一个需求覆盖得相对全的功能。
3)通过cgroup的threaded功能进行分层的管理
——cgroup的threaded功能可以支持线程颗粒度的绑核和限额的控制,但是需要遵循一定的cgroup组层次结构的要求。另外这一个threaded功能目前还没有融进systemd里,这个控制需要另外的服务来做,当然另外的服务需要考虑当前系统里的要管控的进程的systemd的配置,这是需要一定的细节的。
这篇博客展开的是第三种方法,这种方法由于借助的是cgroup的能力,所以它对线程颗粒度的控制更加强大,为什么这么说,因为cgroup的设置一旦生效后,后续的非法的sched_setaffinity的设置都会被忽略,因为cgroup是一个强制的内核级别的管控功能,其他方式都需要遵照这样的规则。
下面第二章里,我们贴出测试程序源码,并进行成果展示,在第三章里,我们展开相关功能的一些细节。
二、测试源码及成果展示
2.1 测试源码
#include <iostream>
#include <thread>
#include <chrono>
#include <vector>
#include <string>
#include <cstdlib>
#include <fstream>
#include <unistd.h>
#include <sys/syscall.h>const int THREAD_COUNT = 200;
const int RUN_TIME_US = 100; // 100 us
const std::string CGROUP_NAME = "test/my_cgroup";// 获取线程的 TID
pid_t gettid() {return static_cast<pid_t>(syscall(SYS_gettid));
}void threadFunction(const std::string& cgroup_path) {// 将当前线程的 TID 写入 cgroup.threadsstd::ofstream cgroup_threads(cgroup_path + "/cgroup.threads", std::ios::app);if (cgroup_threads.is_open()) {cgroup_threads << gettid() << std::endl; // 写入当前线程的 TIDcgroup_threads.close();}while (true) { // 无限循环,您可以根据需要添加退出条件// 获取当前时间auto start_time = std::chrono::high_resolution_clock::now();// 进行 100 微秒的死循环auto end_time = start_time + std::chrono::microseconds(RUN_TIME_US);while (std::chrono::high_resolution_clock::now() < end_time) {// 当前循环只是占用CPU}// 计算剩余的时间并休眠auto sleep_duration = std::chrono::milliseconds(100) - (std::chrono::high_resolution_clock::now() - start_time);if (sleep_duration > std::chrono::milliseconds(0)) {std::this_thread::sleep_for(sleep_duration); // 休眠剩余时间}}
}void threadFunctionEx(const std::string& cgroup_path) {// 将当前线程的 TID 写入 cgroup.threadsstd::ofstream cgroup_threads(cgroup_path + "/cgroup.threads", std::ios::app);if (cgroup_threads.is_open()) {cgroup_threads << gettid() << std::endl; // 写入当前线程的 TIDcgroup_threads.close();}std::this_thread::sleep_for(std::chrono::seconds(1));std::string command = "/usr/bin/deadloop &";system(command.c_str());while (true) { // 无限循环,您可以根据需要添加退出条件// 获取当前时间auto start_time = std::chrono::high_resolution_clock::now();// 进行 100 微秒的死循环auto end_time = start_time + std::chrono::microseconds(RUN_TIME_US);while (std::chrono::high_resolution_clock::now() < end_time) {// 当前循环只是占用CPU}// 计算剩余的时间并休眠auto sleep_duration = std::chrono::milliseconds(100) - (std::chrono::high_resolution_clock::now() - start_time);if (sleep_duration > std::chrono::milliseconds(0)) {std::this_thread::sleep_for(sleep_duration); // 休眠剩余时间}}
}void createCgroup(std::string& cgroup_path) {// 创建 cgroup 目录cgroup_path = "/sys/fs/cgroup/" + CGROUP_NAME;std::string command = "mkdir -p " + cgroup_path;system(command.c_str());// 设置 cgroup 为线程模式std::ofstream cgroup_mode(cgroup_path + "/cgroup.type");if (cgroup_mode.is_open()) {cgroup_mode << "threaded" << std::endl; // 设置为线程模式cgroup_mode.close();}// 将当前进程的 PID 写入 cgroup.procsstd::ofstream cgroup_cpus(cgroup_path + "/cpuset.cpus");if (cgroup_cpus.is_open()) {cgroup_cpus << 30;cgroup_cpus.close();}// 设置 CPU 限制std::ofstream cpu_max(cgroup_path + "/cpu.max");if (cpu_max.is_open()) {cpu_max << "15000 100000" << std::endl; // 设置 CPU 限制cpu_max.close();}
}int main() {std::string cgroup_path;cgroup_path = "/sys/fs/cgroup/test";std::string command = "mkdir -p " + cgroup_path;system(command.c_str());command = "echo " + std::to_string(getpid()) + " >" + cgroup_path + "/cgroup.procs";system(command.c_str());command = "echo +cpuset +cpu > " + cgroup_path + "/cgroup.subtree_control";system(command.c_str());// 创建 cgroupcreateCgroup(cgroup_path);// 创建线程std::vector<std::thread> threads;for (int i = 0; i < THREAD_COUNT; ++i) {threads.emplace_back(threadFunction, cgroup_path);}threads.emplace_back(threadFunctionEx, cgroup_path);// 主线程等待所有子线程完成for (auto& thread : threads) {thread.join();}// 清理 cgroupcommand = "rmdir " + cgroup_path; // 清理 cgroup 目录system(command.c_str());return 0;
}
2.2 成果展示
运行 2.1 源码编出的程序后,通过如下命令查看所在的cgroup组:
cat /proc/2808174/cgroup
看到主线程所在的cgroup组是/sys/fs/cgroup/test的这个cgroup组,我们看一下其他线程所在的cgroup组:
可以看到其他线程都是在/sys/fs/cgroup/test/my_cgroup这个cgroup组下的,我们看一下test和test/my_cgroup这两个cgroup组的当前模式:
可以看到test这个cgroup组的模式是domain threaded,test/my_cgroup这个cgroup组的模式是threaded。
另外,可以从下图看到,代码里创建的一个死循环程序,属于该testcgroupthread进程里一个线程的子进程:
如上图,是先把当前线程加入到threaded模式的组里,再进行的fork来创建deadloop程序。
这时候,该deadloop程序还是属于当前这个threaded模式的组里的:
关于这个父子进程的cgroup实验的更多细节见之前的博客 cgroup父子进程的加组实验_linux cgroup例子-CSDN博客。
三、细节展开
3.1 若要把某个线程加入到threaded类型的子组里,需要先把该线程加入到threaded类型子组的父组里
下图的命令和命令执行情况可以清楚的看到标题的这个结论:
若要把某个线程加入到threaded类型的子组里,需要先把该线程加入到threaded类型子组的父组里
3.2 若把一个进程里的某个线程调整到某个domain的cgroup组里,该进程上的所有线程都会被调整到该cgroup组里
下图的命令和命令执行情况可以清楚的看到标题的这个结论:
若把一个进程里的某个线程调整到某个domain的cgroup组里,该进程上的所有线程都会被调整到该cgroup组里
如上图,左边的terminal里是启动了 2.1 一节源码里的程序,它加入的是/sys/fs/cgroup/test这个cgroup组里,但是如上图里右边截图,一旦我们调整了其中一个线程echo到/sys/fs/cgroup/cgroup.procs里后,该进程上的所有线程都被一同拉过去了。
3.3 若domain的type的cgroup组内创建了一个threaded类型的子组后,父组的模式就从domain变成了domain threaded
下图的命令和命令执行情况可以清楚的看到标题的这个结论:
若domain的type的cgroup组内创建了一个threaded类型的子组后,父组的模式就从domain变成了domain threaded。
相关文章:
cgroup threaded功能例子
一、背景 cgroup在如今的系统里基本都是默认打开的一个功能。对于cgroup的cpu子系统,默认的颗粒度是进程为维度进行cgroup的cpu及cpuset的控制。而对于一些复杂进程,可能的需求是进程里一些个别线程要绑定在X1-Xn这些cpu核上,而除了这些个别…...
Elasticsearch插件:IDEA中的Elasticsearch开发利器
Elasticsearch插件:IDEA中的Elasticsearch开发利器 一、插件概述 Elasticsearch插件是为IntelliJ IDEA设计的专业工具,它让开发者能在IDE内直接与Elasticsearch集群交互,提供了查询编写、索引管理、数据分析等全方位支持。 核心价值&#…...
electron从安装到启动再到打包全教程
目录 介绍 安装 修改npm包配置 执行安装命令 源代码 运行 打包 先安装git, 安装打包工具 导入打包工具 执行打包命令 总结 介绍 electron确实好用,但安装是真的要耗费半条命。每次安装都会遇到各种问题,然后解决了之后。后面就不需要安装了,但有时候比如电脑重装…...
【Linux】轻量级命令解释器minishell
Minishell 一、项目背景 在linux操作系统中,用户对操作系统进行的一系列操作都不能直接操作内核,而是通过shell间接对内核进行操作。 Shell 是操作系统中的一种程序,它为用户提供了一种与操作系统内核和计算机硬件进行交互的界面。用户可以通…...
KEIL报错解决方案:No Algorithm found for: 08001000H - 080012EBH?
改这里: Cortex JLink/JTrace Target Drive - Flash Download - Size: 配好你这款芯片应该用的空间大小...
用银河麒麟 LiveCD 快速查看原系统 IP 和打印机配置
原文链接:用银河麒麟 LiveCD 快速查看原系统 IP 和打印机配置 Hello,大家好啊!今天给大家带来一篇在银河麒麟操作系统的 LiveCD 或系统试用镜像环境下,如何查看原系统中电脑的 IP 地址与网络打印机 IP 地址的实用教程。在系统损坏…...
DeepseekV3MLP 模块
目录 代码代码解释导入和激活函数配置类初始化方法前向传播方法计算流程 代码可视化 代码 import torch import torch.nn as nn import torch.nn.functional as F# 定义激活函数字典 ACT2FN {"relu": F.relu,"gelu": F.gelu,"silu": F.silu,&q…...
Ubuntu 系统下安装和使用性能分析工具 perf
在 Ubuntu 系统下安装和使用性能分析工具 perf 的步骤如下: 1. 安装 perf perf 是 Linux 内核的一部分,通常通过安装 linux-tools 包获取: # 更新软件包列表 sudo apt update# 安装 perf(根据当前内核版本自动匹配) …...
安恒Web安全面试题
《网安面试指南》https://mp.weixin.qq.com/s/RIVYDmxI9g_TgGrpbdDKtA?token1860256701&langzh_CN 5000篇网安资料库https://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247486065&idx2&snb30ade8200e842743339d428f414475e&chksmc0e4732df793fa3bf39…...
OSPF --- LSA
文章目录 一、OSPF LSA(链路状态通告)详解1. LSA通用头部2. OSPFv2 主要LSA类型a. Type 1 - Router LSAb. Type 2 - Network LSAc. Type 3 - Summary LSAd. Type 4 - ASBR Summary LSAe. Type 5 - AS External LSAf. Type 7 - NSSA External LSA 3. LSA泛…...
IDEA/WebStorm中Git操作缓慢的解决方案
问题描述 在WebStorm中进行前端开发时,发现Git操作(如push、checkout、pull等)特别缓慢,而在命令行(cmd)中执行相同的Git命令却很快,排除了网络问题。 解决方案 通过修改WebStorm安装目录下的runnerw.exe文件名可以…...
网络威胁情报 | Yara
Yara 是一个在威胁情报、数字取证和威胁猎取方面较为常用的语言。本文并非是Yara语言的教程,更多的是希望可以让大家知道这个语言的神奇之处及其在当今信息安全领域的重要性。 Yara 是什么? “恶意软件研究人员(以及其他所有人)…...
12.QT-Combo Box|Spin Box|模拟点餐|从文件中加载选项|调整点餐份数(C++)
Combo Box QComboBox 表⽰下拉框 核⼼属性 属性说明currentText当前选中的⽂本currentIndex当前选中的条⽬下标.从0开始计算.如果当前没有条⽬被选中,值为-1editable是否允许修改设为true时, QComboBox 的⾏为就⾮常接近 QLineEdit ,也可以 设置 validatoriconSize下拉框图标…...
FTTR 全屋光纤架构分享
随着光纤网络技术的发展,FTTR 技术逐步普及到千家万户,为了战未来,从现在开始构建并铺设 FTTR 全屋光纤是非常有必要的。 在前期 FTTR 全屋光纤网络的载荷搭建,可以额定为千兆网络或者2.5GE光纤网络,万兆光网最大的成本…...
内网穿透快解析免费开放硬件集成SDK
一、行业问题 随着物联网技术的发展,符合用户需求的智能硬件设备被广泛的应用到各个领域,而智能设备的远程运维管理也是企业用户遇到的问题 二、快解析内网穿透解决方案 快解析是一款内网穿透产品,可以实现内网资源在外网访问,…...
实验八 版本控制
实验八 版本控制 一、实验目的 掌握Git基本命令的使用。 二、实验内容 1.理解版本控制工具的意义。 2.安装Windows和Linux下的git工具。 3.利用git bash结合常用Linux命令管理文件和目录。 4.利用git创建本地仓库并进行简单的版本控制实验。 三、主要实验步骤 1.下载并安…...
《马尼拉》桌游期望计算器
《马尼拉》桌游期望计算器:做出最明智的决策 注:本项目仍在开发验证中,计算结果可能不够准确,欢迎游戏爱好者提供协助! 在线使用 | GitHub 项目简介 马尼拉期望计算器是一个基于 Vue 3 Vite 开发的网页应用ÿ…...
VLAN间通讯技术
多臂路由 路由器使用多条物理线路,每条物理线路充当一个 VLAN 的网管 注意:路由器对端的交换机接口,需要设定 Access 类型,因为路由器的物理接口无法处理 VLAN 标签 。 单臂路由 使用 以太网子接口 (sub-interface) 实现。 …...
linux基础学习--linux文件与目录管理
linux文件与目录管理 1. 目录与路径 1.1 相对路径与绝对路径 绝对路径:路径写法一定从根目录/写起。 绝对路径的正确度要高。 相对路径:路径写法不是由/写起。 1.2 目录的相关操作 切换目录的命令是cd,下面是比较特殊的目录:…...
云原生--基础篇-2--云计算概述(云计算是云原生的基础,IaaS、PaaS和SaaS服务模型)
1、云计算概念 云计算是一种通过互联网提供计算资源(包括服务器、存储、数据库、网络、软件等)和服务的技术模式。用户无需拥有和维护物理硬件,而是可以根据需要租用这些资源,并按使用量付费。 2、云计算特点 (1&am…...
存储器综合:内存条
一、RW 1000题刷题 1、计算Cache缺失率 2、 二、前提回顾 1、CPU从单个DRAM芯片中取地址 注意:Cache与主存的交互以“主存块”为单位,当出现Cache Miss时,主存以“主存块”为单位传输至Cache中。 2、内存条编址 多个DRAM芯片组成内存条&a…...
树莓派超全系列教程文档--(38)config.txt视频配置
config.txt视频配置 视频选项HDMI模式树莓派4-系列的HDMI树莓派5-系列的HDMI 复合视频模式enable_tvout LCD显示器和触摸屏ignore_lcddisable_touchscreen 通用显示选项disable_fw_kms_setup 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 视频选…...
pytest-项目结构
项目结构 api_test_project/ ├── config/ │ └── config.py # 配置文件,存储接口的基本信息,如 URL、请求头、认证信息等 ├── data/ │ └── test_data.json # 测试数据文件,存储接口的请求参数、预期结果等 ├── tests/…...
几何编码:启用矢量模式地理空间机器学习
在 ML 模型中使用点、线和多边形,将它们编码为捕捉其空间属性的向量。 自地理信息系统 (GIS) 诞生之初,“栅格模式”和“矢量模式”之间就存在着显著的区别。在栅格模式下,数据以值的形式呈现在规则的网格上。这包括任何形式的图像࿰…...
什么是SPA,SPA与MAP区别
什么是SPA,SPA与MAP区别 文章目录 什么是SPA,SPA与MAP区别一、什么是SPA二、SPA和MPA的区别一、单页应用与多页应用的区别**二、SPA 的优缺点对比**三、WPA的优缺点 **三、SPA 实现关键技术**hash 模式模式history模式 四、SPA 的适用场景与原因**适用场…...
计算机前沿技术课程论文 K-means算法在图像处理的应用
K-means算法在图像处理的应用 这是本人在计算机前沿技术课程中的课程论文文章,为了方便大家参考学习,我把完整的论文word文档发到了我的资源里,有需要的可以自取。 点击完整资源链接 目录 K-means算法在图像处理的应用摘要:引言1…...
第十四届蓝桥杯 2023 C/C++组 平方差
目录 题目: 题目描述: 题目链接: 思路: 核心思路: 第一种思路: 第二种思路: 坑点: 代码: 数学找规律 O(n) 50分代码详解: O(1)满分代码详解&#x…...
【数学建模】随机森林算法详解:原理、优缺点及应用
随机森林算法详解:原理、优缺点及应用 文章目录 随机森林算法详解:原理、优缺点及应用引言随机森林的基本原理随机森林算法步骤随机森林的优点随机森林的缺点随机森林的应用场景Python实现示例超参数调优结论参考文献 引言 随机森林是机器学习领域中一种…...
计算机组成与体系结构:存储器(Memory)
目录 📁 当你打开一个文件,计算机会做什么? ⚡ 越大的 memory,访问速度越快吗? 🧠 那么,我们是怎么设计存储器的呢? Primary Memory(主存)登场ÿ…...
MyBatis框架—xml映射
目录 一.为什么需要进行手动映射? 二.关联查询 1.使用resultMap进行映射 2.使用Connection进行映射 一.为什么需要进行手动映射? 当我们设计多表查询或关联查询时,表中含有相同的字段名或要进行关联查询时,MyBatis无法智能识别如何处理映射结果&…...
Vue接口平台学习十——接口用例页面2
效果图及简单说明 左边选择用例,右侧就显示该用例的详细信息。 使用el-collapse折叠组件,将请求到的用例详情数据展示到页面中。 所有数据内容,绑定到caseData中 // 页面绑定的用例编辑数据 const caseData reactive({title: "",…...
Visual Studio 2022 运行一个后台程序而不显示控制台窗口
在 Visual Studio 2022 中,希望运行一个后台程序而不显示控制台窗口(黑色命令框),可以通过以下方法实现: 修改项目输出类型为 Windows 应用程序 右键项目 → 选择 属性 (Properties)在 配置属性 → 链接器 → 系统 (…...
剑指Offer(数据结构与算法面试题精讲)C++版——day17
剑指Offer(数据结构与算法面试题精讲)C版——day17 题目一:节点值之和最大的路径题目二:展平二叉搜索树题目三:二叉搜索树的下一个节点附录:源码gitee仓库 题目一:节点值之和最大的路径 题目&am…...
opencv函数展示4
一、形态学操作函数 1.基本形态学操作 (1)cv2.getStructuringElement() (2)cv2.erode() (3)cv2.dilate() 2.高级形态学操作 (1)cv2.morphologyEx() 二、直方图处理函数 1.直方图…...
10天学会嵌入式技术之51单片机-day-3
第九章 独立按键 按键的作用相当于一个开关,按下时接通(或断开),松开后断开(或接通)。实物图、原理图、封装 9.2 需求描述 通过 SW1、SW2、SW3、SW4 四个独立按键分别控制 LED1、LED2、LED3、LED4 的亮…...
DeepSeek智能时空数据分析(二):3秒对话式搞定“等时圈”绘制
序言:时空数据分析很有用,但是GIS/时空数据库技术门槛太高 时空数据分析在优化业务运营中至关重要,然而,三大挑战仍制约其发展:技术门槛高,需融合GIS理论、SQL开发与时空数据库等多领域知识;空…...
第 7 篇:总结与展望 - 时间序列学习的下一步
第 7 篇:总结与展望 - 时间序列学习的下一步 (图片来源: Guillaume Hankenne on Pexels) 恭喜你!如果你一路跟随这个系列走到了这里,那么你已经成功地完成了时间序列分析的入门之旅。我们从零开始,一起探索了时间数据的基本概念、…...
计算机视觉中的正则化:从理论到实践的全面解析
🌟 计算机视觉中的正则化:从理论到实践的全面解析🌟 大家好!今天要和大家分享的是在计算机视觉(CV)领域中非常重要的一个概念——正则化(Regularization)。无论你是刚开始接触深度学…...
解决使用hc595驱动LED数码管亮度低的问题
不知道大家在做项目的时候有没有遇到使用hc595驱动LED数码管亮度低的问题(数码管位数较多),如果大佬们有好的方法的可以评论区留言 当时我们解决是换成了天微的驱动芯片,现在还在寻找新的解决办法(主要软件不花钱&…...
Allegro23.1新功能之4K显示器页面显示不全如何解决操作指导
Allegro23.1新功能之4K显示器页面显示不全如何解决操作指导 Allegro升级到了23.1的时候,可能会出现界面显示不全的情况,如下图 是因为4K高清显示器的原因导致的 如何解决,具体操作如下 我的电脑,右键选择属性 点击高级系统设置 …...
C++——STL——容器deque(简单介绍),适配器——stack,queue,priority_queue
目录 1.deque(简单介绍) 1.1 deque介绍: 1.2 deque迭代器底层 1.2.1 那么比如说用迭代器实现元素的遍历,是如何实现的呢? 1.2.2 头插 1.2.3 尾插 1.2.4 实现 编辑 1.2.5 总结 2.stack 2.1 函数介绍 2.2 模…...
网络原理——UDP
1、 与TCP的关键区别 特性UDPTCP连接方式无连接面向连接可靠性不可靠可靠数据顺序不保证顺序保证顺序传输速度更快相对较慢头部开销8字节20-60字节流量控制无有拥塞控制无有适用场景实时应用、广播/多播可靠性要求高的应用 2、UDP 报文结构 报文结构大致可以分为首部和载荷&a…...
下载pycharm遇到的问题及解决方法
下载和安装 PyCharm 时可能会遇到一些具体问题,以下是一些常见问题及其解决方法: 常见问题及解决方法 下载速度慢或下载中断 解决方法: 检查你的互联网连接,并重启路由器。尝试使用不同的网络连接(如使用移动热点&…...
微硕WSP4407A MOS管在智能晾衣架中的应用与市场分析
微硕WSP4407A MOS管在智能晾衣架中的应用与市场分析 一、引言 智能晾衣架作为一种现代化的家居设备,其核心部件之一是驱动电路,而MOS管作为驱动电路中的关键元件,其性能直接影响到智能晾衣架的运行效率和稳定性。微硕半导体推出的WSP4407A …...
Java 性能优化:如何利用 APM 工具提升系统性能?
Java 性能优化:如何利用 APM 工具提升系统性能? 在当今竞争激烈的软件开发领域,系统性能至关重要。随着应用规模的扩大和用户需求的增加,性能问题逐渐凸显,这不仅影响用户体验,还可能导致业务损失。而 APM…...
FPGA 中 XSA、BIT 和 DCP 文件的区别
在 FPGA(现场可编程门阵列)开发中,XSA、BIT 和 DCP 文件是常见的文件类型,它们在功能、用途、文件内容等方面存在明显区别,以下是详细介绍: 1. XSA 文件 定义与功能 XSA(Xilinx Shell Archiv…...
【c语言】指针进阶
目录 1.字符指针 2.指针数组 3.数组指针 3.1 数组指针的定义 3.2 数组指针的使用 4.数组参数,指针参数 4.1 一维数组传参 4.2 二维数组传参 4.3 一级指针传参 4.4 二级指针传参 5.函数指针 6.函数指针数组 6.1函数指针数组的定义 6.2 函数指针数组…...
使用FastAPI与OpenAI构建多模态分析API服务
引言 随着多模态AI模型的普及(如Qwen-Omni-Turbo),开发者可以轻松构建支持图像、音频、视频分析的API服务。本文将通过一个FastAPI示例,展示如何通过Base64编码传输媒体文件,并结合OpenAI API实现异步分析。这一方案适…...
集成学习实际案例
一、算法竞赛经典:Kaggle & 国际赛事 1. 泰坦尼克号生存预测(Random Forest) 场景:Kaggle 入门级经典赛题,基于乘客信息预测生存概率。方案: 基模型:决策树(CART)&…...
Linux421用户、组
参考...