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

Kubernetes金丝雀发布

华子目录

  • Canary金丝雀发布
  • 什么是金丝雀发布
  • Canary发布方式
    • 基于header(http包头)灰度发布
    • 基于权重的金丝雀发布

Canary金丝雀发布

在这里插入图片描述

什么是金丝雀发布

  • 金丝雀发布也称为灰度发布,是一种软件发布策略
  • 主要目的是在将新版本软件全面推广到生产环境之前,先在一小部分用户服务器上进行测试验证,以降低新版本引入重大问题而对整个系统造成的影响
  • 是一种Pod发布方式金丝雀发布采取先添加再删除的方式,保证Pod总量不低于期望值。并且在更新部分Pod后,暂停更新,当确认新Pod版本运行正常后再进行其他版本Pod的更新

Canary发布方式

三种发布方式

  • 优先级:head大于cookie大于weight
  • 其中headerweight用的最多

基于header(http包头)灰度发布

在这里插入图片描述
我们可以看到如果包头中有stage=gray键值对,就访问新版本包头中没有那个键值对,就访问旧版本

  • 通过Annotaion扩展
  • 创建灰度ingress,配置灰度头部key以及value
  • 灰度流量验证完毕后,切换正式ingress新版本
  • 之前我们在做升级时可以通过控制器滚动更新,默认25%利用header可以使升级更为平滑,通过keyvalue 测试新的业务体系是否有问题

创建2deployment控制器

#发现没有运行的pod
[root@k8s-master service]# kubectl get pods
No resources found in default namespace.#创建一个deployment控制器,控制器中运行一个pod
[root@k8s-master service]# kubectl create deployment deployment --image myapp:v1 --dry-run=client -o yaml > deployment-v1.yml[root@k8s-master service]# vim deployment-v1.yml
[root@k8s-master service]# cat deployment-v1.yml
apiVersion: apps/v1
kind: Deployment   #指明这是一个deployment控制器
metadata:   #控制器的元数据labels:    #控制器的标签app: deployment1   #控制器的标签name: deployment1   #控制器的名字
spec:  控制器的规格replicas: 1  #pod数量selector:  #pod选择器matchLabels:   #声明的要管理的podapp: myappv1  #标签为app=myappv1的pod会被管理template:    #pod的模板metadata:    #pod的元数据labels:     #pod的标签app: myappv1spec:     #pod的规格containers:- image: myapp:v1name: myappv1#在克隆一份
[root@k8s-master service]# cp deployment-v1.yml deployment-v2.yml
[root@k8s-master service]# vim deployment-v2.yml
[root@k8s-master services]# cat deployment-v2.yml
apiVersion: apps/v1
kind: Deployment  #指明这个一个deployment控制器
metadata:     #控制器的元数据labels:     app: deployment2   #控制器的标签name: deployment2   #控制器的名字
spec:    #控制器的规格replicas: 1    #pod数量selector:     #pod选择器matchLabels:    app: myappv2   #声明需要管理的标签template:    #pod的模板metadata:    #pod的元数据labels:   app: myappv2  #pod的标签spec:   #pod的规格containers:- image: myapp:v2name: myappv2 
[root@k8s-master service]# kubectl apply -f deployment-v1.yml
deployment.apps/deployment1 created
[root@k8s-master service]# kubectl apply -f deployment-v2.yml
deployment.apps/deployment2 created[root@k8s-master service]# kubectl get pods -o wide --show-labels
NAME                           READY   STATUS    RESTARTS   AGE     IP            NODE            NOMINATED NODE   READINESS GATES   LABELS
deployment1-5c47495d84-ds4cl   1/1     Running   0          3m20s   10.244.2.15   k8s-node2.org   <none>           <none>            app=myappv1,pod-template-hash=5c47495d84
deployment2-67cc8c4845-bfnvx   1/1     Running   0          6m49s   10.244.2.14   k8s-node2.org   <none>           <none>            app=myappv2,pod-template-hash=67cc8c4845

创建2service微服务

[root@k8s-master service]# kubectl expose deployment deployment1 --port 8080 --target-port 80 --dry-run=client -o yaml >> deployment-v1.yml[root@k8s-master service]# kubectl expose deployment deployment2 --port 8080 --target-port 80 --dry-run=client -o yaml >> deployment-v2.yml
[root@k8s-master service]# vim deployment-v1.yml
[root@k8s-master service]# cat deployment-v1.yml
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: deployment1name: deployment1
spec:replicas: 1selector:matchLabels:app: myappv1template:metadata:labels:app: myappv1spec:containers:- image: myapp:v1name: myappv1---
apiVersion: v1
kind: Service   #指明这是一个service微服务
metadata:   #微服务元数据labels:  app: deployment1  #微服务标签 name: deployment1   #微服务的名字
spec:    #微服务的规格ports:   #是一个端口列表,用于描述service应该监听的端口以及如何将流量转发给pod- port: 8080   #service微服务监听的端口号protocol: TCP   #使用的协议,这里是TCPtargetPort: 80   #pod上应用程序监听的端口selector:    #标签选择器,用于确定哪些pods应该被这个service管理app: myappv1  #pod标签为app=myappv1的被该service管理
[root@k8s-master service]# vim deployment-v2.yml
[root@k8s-master service]# cat deployment-v2.yml
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: deployment2name: deployment2
spec:replicas: 1selector:matchLabels:app: myappv2template:metadata:labels:app: myappv2spec:containers:- image: myapp:v2name: myappv2---
apiVersion: v1
kind: Service
metadata:labels:app: deployment2name: deployment2
spec:ports:- port: 8080protocol: TCPtargetPort: 80selector:app: myappv2
[root@k8s-master service]# kubectl apply -f deployment-v1.yml
deployment.apps/deployment1 unchanged
service/deployment1 created
[root@k8s-master service]# kubectl apply -f deployment-v2.yml
deployment.apps/deployment2 unchanged
service/deployment2 created
[root@k8s-master service]# kubectl get pods -o wide --show-labels
NAME                           READY   STATUS    RESTARTS   AGE   IP            NODE            NOMINATED NODE   READINESS GATES   LABELS
deployment1-5c47495d84-ds4cl   1/1     Running   0          15m   10.244.2.15   k8s-node2.org   <none>           <none>            app=myappv1,pod-template-hash=5c47495d84
deployment2-67cc8c4845-bfnvx   1/1     Running   0          18m   10.244.2.14   k8s-node2.org   <none>           <none>            app=myappv2,pod-template-hash=67cc8c4845[root@k8s-master service]# kubectl get svc -o wide
NAME          TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE    SELECTOR
deployment1   ClusterIP   10.108.37.167   <none>        8080/TCP   3m8s   app=myappv1
deployment2   ClusterIP   10.96.202.197   <none>        8080/TCP   3m2s   app=myappv2
kubernetes    ClusterIP   10.96.0.1       <none>        443/TCP    27d    <none>[root@k8s-master service]# kubectl describe svc deployment1
Name:              deployment1
Namespace:         default
Labels:            app=deployment1
Annotations:       <none>
Selector:          app=myappv1
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.108.37.167
IPs:               10.108.37.167
Port:              <unset>  8080/TCP
TargetPort:        80/TCP
Endpoints:         10.244.2.15:80
Session Affinity:  None
Events:            <none>[root@k8s-master service]# kubectl describe svc deployment2
Name:              deployment2
Namespace:         default
Labels:            app=deployment2
Annotations:       <none>
Selector:          app=myappv2
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.96.202.197
IPs:               10.96.202.197
Port:              <unset>  8080/TCP
TargetPort:        80/TCP
Endpoints:         10.244.2.14:80
Session Affinity:  None
Events:            <none>
  • 创建ingress1.yml
[root@k8s-master service]# kubectl create ingress ingress1 --class nginx --rule='/=deployment1:8080' --dry-run=client -o yaml > ingress1.yml[root@k8s-master service]# vim ingress1.yml
[root@k8s-master service]# cat ingress1.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: ingress1
spec:ingressClassName: nginxrules:- http:paths:- backend:service:name: deployment1port:number: 8080path: /pathType: Prefix
  • 创建ingress2.yml
[root@k8s-master service]# kubectl create ingress ingress2 --class nginx --rule='/=deployment2:8080' --dry-run=client -o yaml > ingress2.yml[root@k8s-master service]# vim ingress2.yml
[root@k8s-master service]# cat ingress2.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:annotations:nginx.ingress.kubernetes.io/canary: "true"nginx.ingress.kubernetes.io/canary-by-header: "name"   #键nginx.ingress.kubernetes.io/canary-by-header-value: "huazi"  #值name: ingress2
spec:ingressClassName: nginxrules:- http:paths:- backend:service:name: deployment2port:number: 8080path: /pathType: Prefix
[root@k8s-master service]# kubectl apply -f ingress1.yml
ingress.networking.k8s.io/ingress1 created
[root@k8s-master service]# kubectl apply -f ingress2.yml
ingress.networking.k8s.io/ingress2 created
[root@k8s-master service]# kubectl describe ingress ingress1
Name:             ingress1
Labels:           <none>
Namespace:        default
Address:          172.25.254.10
Ingress Class:    nginx
Default backend:  <default>
Rules:Host        Path  Backends----        ----  --------*/   deployment1:8080 (10.244.2.15:80)
Annotations:  <none>
Events:Type    Reason  Age                From                      Message----    ------  ----               ----                      -------Normal  Sync    12m (x2 over 13m)  nginx-ingress-controller  Scheduled for sync[root@k8s-master service]# kubectl describe ingress ingress2
Name:             ingress2
Labels:           <none>
Namespace:        default
Address:          172.25.254.10
Ingress Class:    nginx
Default backend:  <default>
Rules:Host        Path  Backends----        ----  --------*/   deployment2:8080 (10.244.2.14:80)
Annotations:  nginx.ingress.kubernetes.io/canary: truenginx.ingress.kubernetes.io/canary-by-header: namenginx.ingress.kubernetes.io/canary-by-header-value: huazi
Events:Type    Reason  Age                   From                      Message----    ------  ----                  ----                      -------Normal  Sync    2m21s (x2 over 3m3s)  nginx-ingress-controller  Scheduled for sync

在这里插入图片描述

基于权重的金丝雀发布

在这里插入图片描述

  • 通过Annotaion拓展
  • 创建灰度ingress,配置灰度权重以及总权重
  • 灰度流量验证完毕后,切换正式ingress新版本
#删掉基于header的ingress
[root@k8s-master service]# kubectl delete -f ingress2.yml
ingress.networking.k8s.io "ingress2" deleted
[root@k8s-master service]# vim ingress2.yml
[root@k8s-master service]# cat ingress2.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:annotations:nginx.ingress.kubernetes.io/canary: "true"nginx.ingress.kubernetes.io/canary-weight: "10"    #10/100=10%,将有10%的流量打到新版本上nginx.ingress.kubernetes.io/canary-weight-total: "100"name: ingress2
spec:ingressClassName: nginxrules:- http:paths:- backend:service:name: deployment2port:number: 8080path: /pathType: Prefix
[root@k8s-master service]# kubectl apply -f ingress2.yml
ingress.networking.k8s.io/ingress2 created
[root@k8s-master service]# kubectl describe ingress ingress1
Name:             ingress1
Labels:           <none>
Namespace:        default
Address:          172.25.254.10
Ingress Class:    nginx
Default backend:  <default>
Rules:Host        Path  Backends----        ----  --------*/   deployment1:8080 (10.244.2.15:80)
Annotations:  <none>
Events:Type    Reason  Age                From                      Message----    ------  ----               ----                      -------Normal  Sync    27m (x2 over 27m)  nginx-ingress-controller  Scheduled for sync[root@k8s-master service]# kubectl describe ingress ingress2
Name:             ingress2
Labels:           <none>
Namespace:        default
Address:          172.25.254.10
Ingress Class:    nginx
Default backend:  <default>
Rules:Host        Path  Backends----        ----  --------*/   deployment2:8080 (10.244.2.14:80)
Annotations:  nginx.ingress.kubernetes.io/canary: truenginx.ingress.kubernetes.io/canary-weight: 10nginx.ingress.kubernetes.io/canary-weight-total: 100
Events:Type    Reason  Age                From                      Message----    ------  ----               ----                      -------Normal  Sync    34s (x2 over 44s)  nginx-ingress-controller  Scheduled for sync
  • 写检测脚本
[root@harbor ~]# vim check.sh
#!/bin/bash
v1=0
v2=0
for ((i=0;i<100;i++))
doresponse=`curl -s 172.25.254.50 | grep -c v1`v1=`expr $v1 + $response`v2=`expr $v2 + 1 - $response`
done
echo "v1:$v1  v2:$v2"
[root@harbor ~]# bash check.sh
v1:89  v2:11
[root@harbor ~]# bash check.sh
v1:87  v2:13
#我们发现比例接近于9:1

当我们增加权重

[root@k8s-master service]# vim ingress2.yml
[root@k8s-master service]# cat ingress2.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:annotations:nginx.ingress.kubernetes.io/canary: "true"nginx.ingress.kubernetes.io/canary-weight: "20"nginx.ingress.kubernetes.io/canary-weight-total: "100"name: ingress2
spec:ingressClassName: nginxrules:- http:paths:- backend:service:name: deployment2port:number: 8080path: /pathType: Prefix
[root@k8s-master service]# kubectl apply -f ingress2.yml
ingress.networking.k8s.io/ingress2 configured
[root@harbor ~]# bash check.sh
v1:76  v2:24
[root@harbor ~]# bash check.sh
v1:79  v2:21
#我们发现比例进阶于8:2

相关文章:

Kubernetes金丝雀发布

华子目录 Canary金丝雀发布什么是金丝雀发布Canary发布方式基于header&#xff08;http包头&#xff09;灰度发布基于权重的金丝雀发布 Canary金丝雀发布 什么是金丝雀发布 金丝雀发布也称为灰度发布&#xff0c;是一种软件发布策略主要目的是在将新版本的软件全面推广到生产环…...

树形DP讲解

文章目录 树形DP讲解一、引言二、树形DP基础1、树的定义2、树形DP的基本思想3、代码示例&#xff1a;子树大小 三、经典例题解析1、树的平衡点1.1、代码示例 2、没有上司的舞会&#xff08;树的最大独立集&#xff09;2.1、代码示例 四、总结 树形DP讲解 一、引言 树形动态规…...

容器:如何调试容器

调试容器&#xff0c;主要是指的调试Dockerfile&#xff0c;调试Dockerfile中的各个命令的执行&#xff0c;大小等 1、docker history查看构建过程和所有的中间层 2、docker run rm -it -u root XXX sh&#xff0c;通过临时容器的方式启动&#xff0c;可以调试中间层文件 3、do…...

用图说明 CPU、MCU、MPU、SoC 的区别

CPU CPU 负责执行构成计算机程序的指令&#xff0c;执行这些指令所指定的算术、逻辑、控制和输入/输出&#xff08;I/O&#xff09;操作。 MCU (microcontroller unit) 不同的 MCU 架构如下&#xff0c;注意这里的 MPU 表示 memory protection unit MPU (microprocessor un…...

牛客周赛 Round 65

文章目录 超市思路&#xff1a;Solved&#xff1a; 雨幕思路&#xff1a;Solved&#xff1a; 闺蜜思路&#xff1a;Solved&#xff1a; 医生思路&#xff1a;Solved&#xff1a; 降温&#xff08;easy&#xff09;思路&#xff1a;Solved&#xff1a; F-降温&#xff08;hard&a…...

超级经典的79个软件测试面试题(内含答案)

1、软件的生命周期(prdctrm) 计划阶段(planning)-〉需求分析(requirement)-〉设计阶段(design)-〉编码(coding)->测试(testing)->运行与维护(running maintrnacne) 测试用例 用例编号 测试项目 测试标题 重要级别 预置条件 输入数据 执行步骤 预期结果 2、问&#xf…...

【Mac】安装 F5-TTS

1、下载项目 项目地址&#xff1a;【GitHub】 SWivid F5-TTS 2、创建并激活 Python 虚拟环境 # 创建 Python 虚拟环境 userMac F5-TTS-main % python3 -m venv f5-tts# 激活进入 Python 虚拟环境 userMac F5-TTS-main % source f5-tts/bin/activate (f5-tts) userrMac F5-TT…...

Leaflet查询矢量瓦片偏移的问题

1、问题现象 使用Leaflet绘制工具查询出来的结果有偏移 2、问题排查 1&#xff09;Leaflet中latLngToContainerPoint和latLngToLayerPoint的区别 2&#xff09;使用Leaflet查询需要使用像素坐标 3&#xff09;经排查发现&#xff0c;container获取的坐标是地图容器坐标&…...

存储引擎技术进化

B-tree 目前支撑着数据库产业的半壁江山。 50 年来不变而且人们还没有改变它的意向 鉴定一个算法的优劣&#xff0c;有一个学派叫 IO复杂度分析 &#xff0c;简单推演真假便知。 下面就用此法分析下 B-tree(traditional b-tree) 的 IO 复杂度&#xff0c;对读、写 IO 一目了…...

CentOS 9 Stream 上安装 Maven

CentOS 9 Stream 上安装 Maven 在 CentOS 9 Stream 上安装 Maven&#xff0c;可以按照以下步骤进行&#xff1a; 更新系统软件包&#xff1a; sudo dnf update安装 Maven&#xff1a; CentOS 9 Stream 默认的包管理器中已经包含 Maven&#xff0c;你可以直接安装&#xff1a; s…...

强势改进!TCN-Transformer时间序列预测

强势改进&#xff01;TCN-Transformer时间序列预测 目录 强势改进&#xff01;TCN-Transformer时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现TCN-Transformer时间序列预测&#xff1b; 2.运行环境为Matlab2023b&#xff1b; 3.单个变量时间序…...

MyBatis的不同参数传递封装

MyBatis参数传递 传参方式 1. 使用 #{} 占位符 这是 MyBatis 中最常用的参数传递方式。它将参数直接替换到 SQL 语句中的占位符位置。 单个参数&#xff1a; <select id"selectUserById" resultType"User">SELECT * FROM users WHERE id #{id}…...

kotlin 协程方法总结

Kotlin 协程是一套强大的异步编程工具&#xff0c;以下是对 Kotlin 协程常用方法的总结&#xff1a; 1. 协程构建器 launch: 启动一个新的协程&#xff0c;不阻塞当前线程&#xff0c;返回一个 Job 对象。 GlobalScope.launch {// 协程体}async: 启动一个新的协程并返回一个…...

脉冲当量计算方法

脉冲的概念&#xff1a; 脉冲当量是指控制器输出一个定位控制脉冲时&#xff0c;所产生的定位控制移动的位移。在直线运动中&#xff0c;它表示移动的距离&#xff1b;在圆周运动中&#xff0c;它表示转动的角度。简而言之&#xff0c;脉冲当量就是电机接收一个脉冲信号后能够移…...

TongWeb7.0.E.6_P11嵌入式版本使用指引(by lqw)

文章目录 声明相关概念手册的使用示范工程安装工程介质 安装前准备示范工程参考&#xff08;spring-boot-helloWorld-2.x&#xff09;示范参考 声明 1.本文参考001_TongWeb_V7.0嵌入式版_JavaEE标准容器用户指南_70E6_P11A01.pdf&#xff0c;实际以最新更新的手册为准。 2.本文…...

Node.js:Express 服务 路由

Node.js&#xff1a;Express 服务 & 路由 创建服务处理请求req对象 静态资源托管托管多个资源挂载路径前缀 路由模块化 Express是Node.js上的一个第三方框架&#xff0c;可以快速开发一个web框架。本质是一个包&#xff0c;可以通过npm直接下载。 创建服务 Express创建一…...

C++之多态(上)

C之多态 多态的概念 多态(polymorphism)的概念&#xff1a;通俗来说&#xff0c;就是多种形态。多态分为编译时多态(静态多态)和运⾏时多 态(动态多态)&#xff0c;这⾥我们重点讲运⾏时多态&#xff0c;编译时多态(静态多态)和运⾏时多态(动态多态)。编译时 多态(静态多态)主…...

PySpark单机模式安装教程

目录 1. 环境准备 1.1 安装要求 1.2 检查Python和Java环境 2. 下载并解压Spark 2.1 下载Spark 2.2 解压安装包 3. 配置环境变量 4. 配置Spark 5. 启动Spark Shell 6. 运行测试 7. 关闭Spark Shell 8. 常见问题 8.1 兼容性问题 8.2 环境变量配置 总结 1. 环境准备…...

DEVOPS: 认证与调度

概述 不知道大家有没有意识到一个现实&#xff0c;就是大部分时候&#xff0c;我们已经不像以前一样通过命令行&#xff0c;或者可视窗口来使用一个系统了现在我们上微博、或者网购&#xff0c;操作的其实不是眼前这台设备&#xff0c;而是一个又一个集群 通常&#xff0c;这样…...

ICPC区域赛成都站【赛后回顾+总结】

传送门 前言赛后总结赛后回顾赛后感悟 前言 首先&#xff0c;这是本人本赛季第一场XCPC区域赛&#xff0c;也是本人算竞生涯中第一场XCPC区域赛&#xff08;之前只打过邀请赛和省赛&#xff09;。 赛后总结 然后赛后总结一下&#xff1a;我队天崩开局&#xff0c;我队出师不利…...

ABAP 7.40+新语法实战:5个内表处理技巧让你告别LOOP和IF

ABAP 7.40新语法实战&#xff1a;5个内表处理技巧让你告别LOOP和IF 在SAP开发领域&#xff0c;ABAP语言随着7.40版本的发布迎来了一次重大革新。对于每天需要处理大量内表操作的中级开发者来说&#xff0c;这些新特性不仅能显著减少代码量&#xff0c;更能提升程序的可读性和执…...

在AI编程时代,写技术博客还有意义吗?

在AI编程时代&#xff0c;写技术博客还有意义吗&#xff1f; 1. 引言 当GitHub Copilot、Cursor、Claude等AI编程助手能在一分钟内生成数百行代码&#xff0c;甚至能根据自然语言描述构建整个项目骨架时&#xff0c;一个尖锐的问题摆在了每一位技术人面前&#xff1a;既然AI都能…...

OBS面部追踪插件:让你的直播镜头自动跟随你的脸

OBS面部追踪插件&#xff1a;让你的直播镜头自动跟随你的脸 【免费下载链接】obs-face-tracker Face tracking plugin for OBS Studio 项目地址: https://gitcode.com/gh_mirrors/ob/obs-face-tracker 还在为直播时频繁调整镜头位置而烦恼吗&#xff1f;OBS Face Tracke…...

Auto-Lianliankan:3步实现Python图像识别破解连连看

Auto-Lianliankan&#xff1a;3步实现Python图像识别破解连连看 【免费下载链接】Auto-Lianliankan 基于python图像识别实现的连连看外挂&#xff0c;可实现QQ连连看秒破 项目地址: https://gitcode.com/gh_mirrors/au/Auto-Lianliankan 在游戏自动化领域&#xff0c;Au…...

CANN/cann-bench MHA算子API描述

MHA 算子 API 描述 【免费下载链接】cann-bench 评测AI在处理CANN领域代码任务的能力&#xff0c;涵盖算子生成、算子优化等领域&#xff0c;支撑模型选型、训练效果评估&#xff0c;统一量化评估标准&#xff0c;识别Agent能力短板&#xff0c;构建CANN领域评测平台&#xff0…...

C51结构体内存分配限制与解决方案

1. C51结构体成员的内存空间限制解析在8051单片机开发中&#xff0c;C51编译器对结构体成员的内存分配有着严格限制。这个问题困扰过不少从标准C转向嵌入式开发的工程师。让我用一个实际案例来解释这个技术细节&#xff1a;struct sensor_data {float data temperature; // 试…...

AI行业的“人才缺口”:哪些AI岗位最紧缺

一、AI行业人才缺口的整体态势在AI技术飞速发展的当下&#xff0c;其对各行业的渗透速度远超预期&#xff0c;人才供需矛盾愈发凸显。据《人工智能产业人才发展报告(2025~2026)》测算&#xff0c;中国AI人才总缺口超过580万人&#xff0c;其中核心技术岗位缺口超过80万人。人力…...

在Matlab中绘制横直方图

在“在Matlab中绘制二维直方图”和“在Matlab中绘制三维直方图”中&#xff0c;得到的直方图都是竖直方向的图形&#xff0c;即竖直方图。这篇博文在此基础上绘制横直方图&#xff0c;只需要把bar( )函数和 bar3( )函数分别调整为barh( )函数和 bar3h( )函数即可。在命令窗口输…...

AI行业的“伦理困境”:隐私保护、算法偏见与失业问题

在人工智能技术飞速发展的今天&#xff0c;软件测试行业正经历着前所未有的变革。AI测试工具的广泛应用&#xff0c;极大提升了测试效率&#xff0c;改变了传统测试流程。然而&#xff0c;技术进步的同时&#xff0c;一系列伦理困境也随之而来&#xff0c;隐私保护、算法偏见与…...

碳感知Transformer与硬件协同优化框架解析

1. CATransformers&#xff1a;碳感知Transformer与硬件协同优化框架解析在AI技术快速发展的今天&#xff0c;Transformer模型已成为自然语言处理、计算机视觉和多模态任务的核心架构。然而&#xff0c;这些模型的广泛部署带来了显著的碳排放问题——不仅包括训练和推理过程中的…...