基于 Amazon EKS 的 Stable Diffusion ComfyUI 部署方案

5e6083eaeafb9976ebf48937dc27eb52.gif

01

背景介紹

Stable Diffusion 作為當下最流行的開源 AI 圖像生成模型在游戲行業有著廣泛的應用實踐,無論是 ToC 面向玩家的游戲社區場景,還是 ToB 面向游戲工作室的美術制作場景,都可以發揮很大的價值,如何更好地使用 Stable Diffusion 也成了非常熱門的話題,社區也貢獻了多種 runtime 來實現 Stable Diffusion 的圖像生成,其中廣泛流行的包括:stable-diffusion-webui,ComfyUI,Fooocus 等。同時,如何在企業內部部署運維和迭代 Stable Diffusion 圖像生成平臺也涌現了多種方案。本文將以 ComfyUI 為例,介紹如何在亞馬遜云科技上部署面向美術團隊的 Stable Diffusion 圖像生成平臺。

02

ComfyUI 簡介

ComfyUI 是一個開源的基于節點式工作流的 Stable Diffusion 方案,它將 Stable Diffsuion 模型推理時各個流程拆分成不同的節點,讓用戶可以更加清晰地了解 Stable Diffusion 的原理,并且可以更加精細化地控制整個流程。總體來看,ComfyUI 的學習曲線雖然比較陡,但是相較于其他的 Stable Diffusion runtime 有以下的優勢:

  1. 在 SDXL 模型推理上相較于其他 UI 有很大的性能優化,圖片生成速度相較于 webui 有 10%~25% 的提升。

  2. 高度自定義,可以讓用戶更加精準和細粒度控制整個圖片生成過程,深度用戶可以通過 ComfyUI 更簡單地生成更好的圖片。

  3. workflow 以 json 或者圖片的形式更易于分享傳播,可以更好地提高效率。

  4. 開發者友好,workflow 的 API 調用可以通過簡單加載相同的 API 格式 json 文件,以任何語言來調用生成圖片。

基于 ComfyUI 以上的各種優勢,使得它越來越多地被美術創作者所使用。

03

方案特點

我們根據實際的使用場景設計方案,總結有以下特點:

  • IaC 方式部署,極簡運維,使用 Amazon Cloud Development Kit (Amazon CDK)?和 Amazon EKS Bluprints 來管理 Amazon Elastic Kubernetes Service (Amazon EKS)?集群以承載運行 ComfyUI。

  • 基于 Karpenter 的能力動態伸縮,自定義節點伸縮策略以適應業務需求。

  • 通過 Amazon Spot instances 實例節省 GPU 實例成本。

  • 充分利用 GPU 實例的 instance store,最大化模型加載和切換的性能,同時最小化模型存儲和傳輸的成本。

  • 利用 S3 CSI driver 將生成的圖片直接寫入 Amazon S3,降低存儲成本。

  • 利用 Amazon CloudFront 邊緣節點加速動態請求,以滿足跨地區美術工作室共用平臺的場景(Optional)。

  • 通過 Serverless 事件觸發的方式,當模型上傳 S3 或在 S3 刪除時,觸發工作節點同步模型目錄數據。

04

方案架構

d7ce98289556d4a3db43684d01a0c859.png

分為兩個部分介紹方案架構:

方案部署過程

  1. ComfyUI 的模型存放在 S3 for models,目錄結構和原生的?ComfyUI/models?目錄結構一致。

  2. EKS 集群的 GPU node 在拉起初始化時,會格式化本地的 Instance store,并通過 user-data 從 S3 將模型同步到本地 Instance store。

  3. EKS 運行 ComfyUI 的 pod 會將 node 上的 Instance store 目錄映射到 pod 里的 models 目錄,以實現模型的讀取加載。

  4. 當有模型上傳到 S3 或從 S3 刪除時,會觸發 Lambda 對所有 GPU node 通過 SSM 執行命令再次同步 S3 上的模型到本地 Instance store。

  5. EKS 運行 ComfyUI 的 pod 會通過 PVC 的方式將?ComfyUI/output?目錄映射到 S3 for outputs。

用戶使用過程

  1. 當用戶請求通過 CloudFront –> ALB 到達 EKS pod 時,pod 會首先從 Instance store 加載模型。

  2. pod 推理完成后會將圖片存放在?ComfyUI/output?目錄,通過 S3 CSI driver 直接寫入 S3。

  3. 得益于 Instance store 的性能優勢,用戶在第一次加載模型以及切換模型時的時間相較于其他存儲方案會大大縮短。

此方案已開源,可以通過以下地址獲取部署和測試代碼。具體部署指引請參考第六節。

https://github.com/aws-samples/comfyui-on-eks

05

圖片生成效果

部署完成后可以通過瀏覽器直接訪問 CloudFront 的域名或 Kubernetes Ingress 的域名來使用 ComfyUI 的前端。

d6bd4c965c9bb01f5df7b900bb6b136d.png

也可以通過將 ComfyUI 的 workflow 保存為可供 API 調用的 json 文件,以 API 的方式來調用,可以更好地與企業內的平臺和系統進行結合。參考調用代碼?comfyui-on-eks/test/invoke_comfyui_api.py

99cdb492ca4ee7ef542cf1e1b2c597c2.png

06

方案部署指引

6.1 準備工作

此方案默認你已安裝部署好并熟練使用以下工具:

  • Amazon CLI:latest version

  • eksctl

  • helm

  • kubectl

  • Docker

  • npm

  • CDK:latest version

下載部署代碼,切換分支,安裝?npm packages?并檢查環境

git clone https://github.com/aws-samples/comfyui-on-eks ~/comfyui-on-eks
cd ~/comfyui-on-eks && git checkout Blog1
npm install
npm list
cdk list

運行?npm list?確認已安裝下面的 packages

comfyui-on-eks@0.1.0 ~/comfyui-on-eks
├── @aws-quickstart/eks-blueprints@1.13.1
├── aws-cdk-lib@2.115.0
├── aws-cdk@2.99.1
└── ...

運行?cdk list?確認環境已準備完成,有以下 CloudFormation 可以部署

Comfyui-Cluster
CloudFrontEntry
LambdaModelsSync
S3OutputsStorage
ComfyuiEcrRepo

6.2 部署 EKS 集群

執行以下命令:

cd ~/comfyui-on-eks && cdk deploy Comfyui-Cluster

此時會在 CloudFormation 創建一個名為?Comfyui-Cluster?的 Stack 來部署 EKS Cluster 所需的所有資源,執行時間約 20-30min。

Comfyui-Cluster Stack?的資源定義可以參考?comfyui-on-eks/lib/comfyui-on-eks-stack.ts,需要關注以下幾點:

1、EKS 集群是通過 EKS Blueprints 框架來構建,blueprints.EksBlueprint.builder()

2、通過 EKS Blueprints 的 Addon 給 EKS 集群安裝了以下插件:

  • AwsLoadBalancerControllerAddOn:用于管理 Kubernetes 的 ingress ALB

  • SSMAgentAddOn:用于在 EKS node 上使用 SSM,遠程登錄或執行命令

  • Karpenter:用于對 EKS node 進行擴縮容

  • GpuOperatorAddon:支持 GPU node 運行

3、給 EKS 的 node 增加了 S3 的權限,以實現將 S3 上的模型文件同步到本地 instance store

4、沒有定義 GPU 實例的 nodegroup,而是只定義了輕量級應用的 cpu 實例 nodegroup 用于運行 Addon 的 pods,GPU 實例的擴縮容完全交由 Karpenter 實現

部署完成后,CDK 的 outputs 會顯示一條 ConfigCommand,用來更新配置以 kubectl 來訪問 EKS 集群。

06dc1d2c4229ac9d7eea87d1d65ee250.png

執行上面的 ConfigCommand 命令以授權 kubectl 訪問 EKS 集群

執行以下命令驗證 kubectl 已獲授權訪問 EKS 集群

kubectl get svc

至此,EKS 集群已完成部署。

同時請注意,EKS Blueprints 輸出了 KarpenterInstanceNodeRole,它是 Karpenter 管理的 Node 的 role,請記下這個 role 接下來將在 6.5.2 節進行配置。

6.3 部署存儲模型的 S3 bucket 以及 Lambda 動態同步模型

執行以下命令:

cd ~/comfyui-on-eks && cdk deploy LambdaModelsSync

LambdaModelsSync?的 stack 主要創建以下資源:

  1. S3 bucket:命名規則為?comfyui-models-{account_id}-{region},用來存儲 ComfyUI 使用到的模型

  2. Lambda 以及對應的 role 和 event source:Lambda function 名為?comfy-models-sync,用來在模型上傳到 S3 或從 S3 刪除時觸發 GPU 實例同步 S3 bucket 內的模型到本地

LambdaModelsSync?的資源定義可以參考?comfyui-on-eks/lib/lambda-models-sync.ts,需要關注以下幾點:

  1. Lambda 的代碼在目錄?comfyui-on-eks/lib/ComfyModelsSyncLambda/model_sync.py

  2. lambda 的作用是通過 tag 過濾所有 ComfyUI EKS Cluster 里的 GPU 實例,當存放模型的 S3 發生 create 或 remove 事件時,通過 SSM 的方式讓所有 GPU 實例同步 S3 上的模型到本地目錄(instance store)

S3 for Models 和 Lambda 部署完成后,此時 S3 還是空的,執行以下命令用來初始化 S3 bucket 并下載 SDXL 模型準備測試。

注意:以下命令會將 SDXL 模型下載到本地并上傳到 S3,需要有充足的磁盤空間(20G),你也可以通過自己的方式將模型上傳到 S3 對應的目錄。

region="us-west-2" # 修改 region 為你當前的 region
cd ~/comfyui-on-eks/test/ && bash init_s3_for_models.sh $region

無需等待模型下載上傳 S3 完成,可繼續以下步驟,只需要在 GPU node 拉起前確認模型上傳 S3 完成即可。

6.4 部署存儲 ComfyUI 生成圖片的 S3 bucket

執行以下命令:

cd ~/comfyui-on-eks && cdk deploy S3OutputsStorage

S3OutputsStorage?的 stack 只創建一個 S3 bucket,命名規則為?comfyui-outputs-{account_id}-{region},用于存儲 ComfyUI 生成的圖片。

6.5 部署 ComfyUI Workload

ComfyUI 的 Workload 部署用 Kubernetes 來實現,請按以下順序來依次部署。

6.5.1 構建并上傳 ComfyUI Docker 鏡像

執行以下命令,創建 ECR repo 來存放 ComfyUI 鏡像

cd ~/comfyui-on-eks && cdk deploy ComfyuiEcrRepo

在準備階段部署好 Docker 的機器上運行?build_and_push.sh?腳本

region="us-west-2" # 修改 region 為你當前的 region
cd comfyui-on-eks/comfyui_image/ && bash build_and_push.sh $region

ComfyUI 的 Docker 鏡像請參考?comfyui-on-eks/comfyui_image/Dockerfile,需要注意以下幾點:

  1. 在 Dockerfile 中通過 git clone & git checkout 的方式來固定 ComfyUI 的版本,可以根據業務需求修改為不同的 ComfyUI 版本。

  2. Dockerfile 中沒有安裝 customer node 等插件,可以使用 RUN 來按需添加。

  3. 此方案每次的 ComfyUI 版本迭代都只需要通過重新 build 鏡像,更換鏡像來實現。

構建完鏡像后,執行以下命令確保鏡像的 Architecture 是 X86 架構,因為此方案使用的 GPU 實例均是基于 X86 的機型。

region="us-west-2" # 修改 region 為你當前的 region
ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
image_name=${ACCOUNT_ID}.dkr.ecr.${region}.amazonaws.com/comfyui-images:latest
docker image inspect $image_name|grep Architecture

6.5.2?部署?Karpenter?用以管理?GPU?實例的擴縮容

執行以下命令來部署 Karpenter 的 Provisioner

kubectl apply -f comfyui-on-eks/manifests/Karpenter/karpenter_provisioner.yaml

執行以下命令來驗證 Karpenter 的部署結果

kubectl describe karpenter

Karpenter 的部署需要注意以下幾點:

1、使用了 g5.2xlarge 和 g4dn.2xlarge 機型,同時使用了?on-demand?和?spot?實例。

2、在 userData 中對 karpenter 拉起的 GPU 實例做以下初始化操作:

  1. 格式化 instance store 本地盤,并 mount 到?/comfyui-models?目錄。

  2. 將存儲在 S3 上的模型文件同步到本地 instance store。

在 6.2 節獲取到的 KarpenterInstanceNodeRole 需要添加一條 S3 的訪問權限,以允許 GPU node 從 S3 同步文件,請執行以下命令:

KarpenterInstanceNodeRole="Comfyui-Cluster-ComfyuiClusterkarpenternoderoleE627-juyEInBqoNtU" # 修改為你自己的 role
aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess --role-name $KarpenterInstanceNodeRole

6.5.3 部署 S3 PV 和 PVC 用以存儲生成的圖片

執行以下命令來部署 S3 CSI 的 PV 和 PVC

Run on Linux

region="us-west-2" # 修改 region 為你當前的 region
account=$(aws sts get-caller-identity --query Account --output text)
sed -i "s/region .*/region $region/g" comfyui-on-eks/manifests/PersistentVolume/sd-outputs-s3.yaml
sed -i "s/bucketName: .*/bucketName: comfyui-outputs-$account-$region/g" comfyui-on-eks/manifests/PersistentVolume/sd-outputs-s3.yaml
kubectl apply -f comfyui-on-eks/manifests/PersistentVolume/sd-outputs-s3.yaml

Run on MacOS

region="us-west-2" # 修改 region 為你當前的 region
account=$(aws sts get-caller-identity --query Account --output text)
sed -i ’’ "s/region .*/region $region/g" comfyui-on-eks/manifests/PersistentVolume/sd-outputs-s3.yaml
sed -i ’’ "s/bucketName: .*/bucketName: comfyui-outputs-$account-$region/g" comfyui-on-eks/manifests/PersistentVolume/sd-outputs-s3.yaml
kubectl apply -f comfyui-on-eks/manifests/PersistentVolume/sd-outputs-s3.yaml

6.5.4 部署 EKS S3 CSI Driver

執行以下命令,創建 S3 CSI driver 的 role 和 service account,以允許 S3 CSI driver 對 S3 進行讀寫。

REGION="us-west-2" # 修改 region 為你當前的 region
account=$(aws sts get-caller-identity --query Account --output text)
ROLE_NAME=EKS-S3-CSI-DriverRole-$account-$region
POLICY_ARN=arn:aws:iam::aws:policy/AmazonS3FullAccess
eksctl create iamserviceaccount \--name s3-csi-driver-sa \--namespace kube-system \--cluster Comfyui-Cluster \--attach-policy-arn $POLICY_ARN \--approve \--role-name $ROLE_NAME \--region $REGION

確保執行上述命令的 Identity 在 EKS 集群的?aws-auth?configmap 里

identity=$(aws sts get-caller-identity --query 'Arn' --output text)
kubectl describe configmap aws-auth -n kube-system|grep $identity

執行以下命令,安裝?aws-mountpoint-s3-csi-driver?Addon

helm repo add aws-mountpoint-s3-csi-driver https://awslabs.github.io/mountpoint-s3-csi-driver
helm repo update
helm upgrade --install aws-mountpoint-s3-csi-driver \--namespace kube-system \aws-mountpoint-s3-csi-driver/aws-mountpoint-s3-csi-driver

6.5.5 部署 ComfyUI Deployment 和 Service

執行以下命令來替換容器 image 鏡像

Run on Linux

region="us-west-2" # 修改 region 為你當前的 region
account=$(aws sts get-caller-identity --query Account --output text)
sed -i "s/image: .*/image: ${account}.dkr.ecr.${region}.amazonaws.com\/comfyui-images:latest/g" comfyui-on-eks/manifests/ComfyUI/comfyui_deployment.yaml

Run on MacOS

region="us-west-2" # 修改 region 為你當前的 region
account=$(aws sts get-caller-identity --query Account --output text)
sed -i ’’ ?"s/image: .*/image: ${account}.dkr.ecr.${region}.amazonaws.com\/comfyui-images:latest/g" comfyui-on-eks/manifests/ComfyUI/comfyui_deployment.yaml

執行以下命令來部署 ComfyUI 的 Deployment 和 Service

kubectl apply -f comfyui-on-eks/manifests/ComfyUI

ComfyUI 的 deployment 和 service 部署注意以下幾點:

1、ComfyUI 的 pod 擴展時間和實例類型有關,如果實例不足需要 Karpenter 拉起 node 進行初始化,同步鏡像后才可以被 pod 調度。可以通過以下命令分別查看 Kubernetes 事件以及 Karpenter 日志

podName=$(kubectl get pods -n karpenter|tail -1|awk '{print $1}')
kubectl logs -f $podName -n karpenter
kubect get events --watch

2、不同的 GPU 實例有不同的 Instance Store 大小,如果 S3 存儲的模型總大小超過了 Instance Store 的大小,則需要使用 EFS 或其他方式方式來管理模型存儲

當 comfyui 的 pod running 時,執行以下命令查看 pod 日志

podName=$(kubectl get pods |tail -1|awk '{print $1}')
kubectl logs -f $podName

6.6 測試 ComfyUI on EKS 部署結果

6.6.1 API 測試

使用 API 的方式來測試,在?comfyui-on-eks/test?目錄下執行以下命令

Run on Linux

ingress_address=$(kubectl get ingress|grep comfyui-ingress|awk '{print $4}')
sed -i "s/SERVER_ADDRESS = .*/SERVER_ADDRESS = \"${ingress_address}\"/g" invoke_comfyui_api.py
sed -i "s/HTTPS = .*/HTTPS = False/g" invoke_comfyui_api.py
sed -i "s/SHOW_IMAGES = .*/SHOW_IMAGES = False/g" invoke_comfyui_api.py
./invoke_comfyui_api.py

Run on MacOS

ingress_address=$(kubectl get ingress|grep comfyui-ingress|awk '{print $4}')
sed -i ?’’ "s/SERVER_ADDRESS = .*/SERVER_ADDRESS = \"${ingress_address}\"/g" invoke_comfyui_api.py
sed -i ’’ "s/HTTPS = .*/HTTPS = False/g" invoke_comfyui_api.py
sed -i ’’ "s/SHOW_IMAGES = .*/SHOW_IMAGES = False/g" invoke_comfyui_api.py
./invoke_comfyui_api.py

API 調用邏輯參考?comfyui-on-eks/test/invoke_comfyui_api.py,注意以下幾點:

  1. API 調用執行 ComfyUI 的 workflow 存儲在comfyui-on-eks/test/sdxl_refiner_prompt_api.json

  2. 使用到了兩個模型:sd_xl_base_1.0.safetensors,sd_xl_refiner_1.0.safetensors

  3. 可以在 sdxl_refiner_prompt_api.json 里或 invoke_comfyui_api.py 修改 prompt 進行測試

6.6.2 瀏覽器測試

執行以下命令獲取 ingress 地址

kubectl get ingress

通過瀏覽器直接訪問 ingress 地址。

至此 ComfyUI on EKS 部分已部署測試完成。接下來我們將對 EKS 集群接入 CloudFront 進行邊緣加速。

6.6 部署 CloudFront 邊緣加速(可選)

在?comfyui-on-eks?目錄下執行以下命令,為 Kubernetes 的 ingress 接入 CloudFront 邊緣加速

cdk deploy CloudFrontEntry

CloudFrontEntry?的 stack 可以參考?comfyui-on-eks/lib/cloudfront-entry.ts,需要關注以下幾點:

  1. 在代碼中根據 tag 找到了 EKS Ingress 的 ALB

  2. 以 EKS Ingress ALB 作為 CloudFront Distribution 的 origin

  3. ComfyUI 的 ALB 入口只配置了 HTTP,所以 CloudFront Origin Protocol Policy 設置為 HTTP_ONLY

  4. 加速動態請求,cache policy 設置為 CACHING_DISABLED

部署完成后會打出 Outputs,其中包含了 CloudFront 的 URL?CloudFrontEntry.cloudFrontEntryUrl,參考 6.6 節通過 API 或瀏覽器的方式進行測試。

07

清理資源

執行以下命令刪除所有 Kubernetes 資源

kubectl delete -f comfyui-on-eks/manifests/ComfyUI/
kubectl delete -f comfyui-on-eks/manifests/PersistentVolume/
kubectl delete -f comfyui-on-eks/manifests/Karpenter/

刪除上述部署的資源

cdk destroy ComfyuiEcrRepo
cdk destroy CloudFrontEntry
cdk destroy S3OutputsStorage
cdk destroy LambdaModelsSync
cdk destroy Comfyui-Cluster

總結

本文介紹了一種在 Amazon EKS 上部署 ComfyUI 的方案,通過 Instance store 和 S3 的結合,在降低存儲成本的同時最大化模型加載和切換的性能,同時通過 Serverless 的方式自動化進行模型的同步,使用 spot 實例降低 GPU 實例成本,并且通過 CloudFront 進行全球加速,以滿足跨地區美術工作室協作的場景。整套方案以 IaC 的方式管理底層基礎設施,最小化運維成本。

本篇作者

ceddce8ab8733ba27937fd859cfac0c3.jpeg

王睿

亞馬遜云科技高級解決方案架構師,曾就職于網易游戲和騰訊,從事過 SRE 以及 Game SDE,在游戲和云計算行業有豐富的實踐經驗。

600bb690b6b05bf2b063657a0382afec.gif

星標不迷路,開發更極速!

關注后記得星標「亞馬遜云開發者」

e8a685d1ce4ee7566e0fbd81524ac601.gif

聽說,點完下面4個按鈕

就不會碰到bug了!

f58dd28896ce15b3c3ed2d6bc064c22c.gif

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/716300.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/716300.shtml
英文地址,請注明出處:http://en.pswp.cn/news/716300.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

scanf和cin的利弊

scanf和cin的利弊: scanf: 利:耗時短,寫法方便輸入固定格式,比如scanf(“%*d%d”,&a),可以直接忽略第一個輸入,不用創建新對象,再比如scanf(“%1d”,&x[i]),輸入3214&#x…

卡牌——二分

卡牌 題目分析 想一下前面題的特點,是不是都出現了“最大邊長”,“最小的數”這種字眼,那么這里出現了“最多能湊出多少套牌”,我們可以考慮用二分。接下來我們要看一下他是否符合二段性,二分的關鍵在于二段性。 第…

續Java的執行語句、方法--學習JavaEE的day07

day07 一、特殊的流程控制語句 break(day06) continue 1.理解: 作用于循環中,表示跳過循環體剩余的部分,進入到下一次循環 做實驗: while(true){ System.out.println(“111”); System.out.println(“222”); if(true){ conti…

編譯鏈接實戰(25)gcc ASAN、MSAN檢測內存越界、泄露、使用未初始化內存等內存相關錯誤

文章目錄 1 ASAN1.1 介紹1.2 原理編譯時插樁模塊運行時庫2 檢測示例2.1 內存越界2.2 內存泄露內存泄露檢測原理作用域外訪問2.3 使用已經釋放的內存2.4 將漏洞信息輸出文件3 MSAN1 ASAN 1.1 介紹 -fsanitize=address是一個編譯器選項,用于啟用AddressSanitizer(地址

基于SpringBoot的教師考勤管理系統(贈源碼)

作者主頁:易學蔚來-技術互助文末獲取源碼 簡介:Java領域優質創作者 Java項目、簡歷模板、學習資料、面試題庫 教師考勤管理系統是基于JavaVueSpringBootMySQL實現的,包含了管理員、學生、教師三類用戶。該系統實現了班級管理、課程安排、考勤…

基于springboot的足球俱樂部管理系統的設計與實現

** 🍅點贊收藏關注 → 私信領取本源代碼、數據庫🍅 本人在Java畢業設計領域有多年的經驗,陸續會更新更多優質的Java實戰項目希望你能有所收獲,少走一些彎路。🍅關注我不迷路🍅** 一 、設計說明 1.1 課題…

2024.3.3每日一題

LeetCode 用隊列實現棧 題目鏈接:225. 用隊列實現棧 - 力扣(LeetCode) 題目描述 請你僅使用兩個隊列實現一個后入先出(LIFO)的棧,并支持普通棧的全部四種操作(push、top、pop 和 empty&…

如何取消ChatGPT 4.0的自動續費和會員訂閱(chatgpt4.0自動續費嗎)

如何取消ChatGPT 4.0的自動續費和會員訂閱 ChatGPT 4.0自動續費是否存在 是的,ChatGPT 4.0 Plus會員服務存在自動續費功能。 ChatGPT 4.0 Plus會員服務自動續費 ChatGPT Plus會員服務的自動續費機制用戶在購買ChatGPT 4.0 Plus會員服務后,系統會自動…

npm ERR! code ERESOLVE

1、問題概述? 執行npm install命令的時候報錯如下: tangxiaochuntangxiaochundeMacBook-Pro stf % npm install npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree npm ERR! npm ERR! While resol…

LeetCode102.二叉樹的層序遍歷

題目 給你二叉樹的根節點 root ,返回其節點值的 層序遍歷 。 (即逐層地,從左到右訪問所有節點)。 示例 輸入:root [3,9,20,null,null,15,7] 輸出:[[3],[9,20],[15,7]]輸入:root [1] 輸出&am…

SpringCloud-MQ消息隊列

一、消息隊列介紹 MQ (MessageQueue) ,中文是消息隊列,字面來看就是存放消息的隊列。也就是事件驅動架構中的Broker。消息隊列是一種基于生產者-消費者模型的通信方式,通過在消息隊列中存放和傳遞消息,實現了不同組件、服務或系統…

2024全新手機軟件下載應用排行、平臺和最新發布網站,采用響應式織夢模板

這是一款簡潔藍色的手機軟件下載應用排行、平臺和最新發布網站,采用響應式織夢模板。 主要包括主頁、APP列表頁、APP詳情介紹頁、新聞資訊列表、新聞詳情頁、關于我們等模塊頁面。 地 址 : runruncode.com/php/19703.html 軟件程序演示圖:…

最小高度樹-力扣(Leetcode)

題目鏈接 最小高度樹 思路:本質上是找到樹中的最長路徑。當最長路徑上中間點(若路經長為偶數,則中間點僅有一個,否者中間點有兩個)作為根時,此時樹高最小。 Code: class Solution { public://拓撲排序int…

【深度優先搜索】【樹】【C++算法】2003. 每棵子樹內缺失的最小基因值

作者推薦 動態規劃的時間復雜度優化 本文涉及知識點 深度優先搜索 LeetCode2003. 每棵子樹內缺失的最小基因值 有一棵根節點為 0 的 家族樹 ,總共包含 n 個節點,節點編號為 0 到 n - 1 。給你一個下標從 0 開始的整數數組 parents ,其中…

第二講:用geth和以太坊交互

一:安裝geth brew install ethereum geth github網址: https://github.com/ethereum/go-ethereum 二: 用geth連接以太坊 以太坊有主網絡(Ethereum Mainnet),有測試網絡(Sepolia、Goerli 等等…

設計模式學習筆記 - 設計原則 - 5.依賴反轉原則(控制反轉、依賴反轉、依賴注入)

前言 今天學習 SOLID 中的最后一個原則,依賴反轉原則。 本章內容,可以帶著如下幾個問題: “依賴反轉” 這個概念指的是 “誰跟誰” 的 “什么依賴” 被反轉了? “反轉” 這兩個字該如何理解。我們還經常聽到另外兩個概念&#…

【分塊三維重建】【slam】LocalRF:逐步優化的局部輻射場魯棒視圖合成(CVPR 2023)

項目地址:https://localrf.github.io/ 題目:Progressively Optimized Local Radiance Fields for Robust View Synthesis 來源:KAIST、National Taiwan University、Meta 、University of Maryland, College Park 提示:文章用了s…

【Spring】20 解析Spring注解驅動的容器配置

文章目錄 注解 vs. XMLJavaConfig選項注解配置注解注入順序注解處理器實際運用總結 Spring 框架一直以 XML 配置為主導,然而隨著注解驅動配置的引入,我們不禁思考:是注解配置優于 XML 呢,還是反之?本篇博客將介紹 Spri…

如何將一個遠程git的所有分支推到另一個遠程分支上

如何將一個遠程git的所有分支推到另一個遠程分支上 最初有 12 個分支 執行 git remote add 遠程名 遠程git地址 git push 遠程名 --tags "refs/remotes/origin/*:refs/heads/*"之后就變成 26個分支

小項目:2024/3/2

一、TCP機械臂測試 代碼&#xff1a; #include <myhead.h> #define SER_IP "192.168.125.254" //服務器端IP #define SER_PORT 8888 //服務器端端口號#define CLI_IP "192.168.199.131" //客戶端IP #define CLI_P…