From 9eef82b642cd21eaab3c0c017cc2467721e80d58 Mon Sep 17 00:00:00 2001 From: dc Date: Fri, 30 May 2025 13:45:01 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A8=A1=E5=9E=8B=E9=83=A8=E7=BD=B2=E8=B5=84?= =?UTF-8?q?=E6=BA=90=E5=88=86=E9=85=8D=E9=83=A8=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../deploy/deployment/ResourceAllocator.java | 74 +++++++++++++++++++ .../deploy/entity/DeployRequest.java | 4 + .../deploy/entity/DeployResponse.java | 25 +++++++ .../deploy/entity/DeploymentResource.java | 12 +++ 4 files changed, 115 insertions(+) create mode 100644 src/main/java/com/bipt/intelligentapplicationorchestrationservice/deploy/deployment/ResourceAllocator.java create mode 100644 src/main/java/com/bipt/intelligentapplicationorchestrationservice/deploy/entity/DeployRequest.java create mode 100644 src/main/java/com/bipt/intelligentapplicationorchestrationservice/deploy/entity/DeployResponse.java create mode 100644 src/main/java/com/bipt/intelligentapplicationorchestrationservice/deploy/entity/DeploymentResource.java diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/deploy/deployment/ResourceAllocator.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/deploy/deployment/ResourceAllocator.java new file mode 100644 index 0000000..a6273f6 --- /dev/null +++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/deploy/deployment/ResourceAllocator.java @@ -0,0 +1,74 @@ +package com.bipt.intelligentapplicationorchestrationservice.deploy.deployment; + +import com.bipt.intelligentapplicationorchestrationservice.deploy.entity.DeploymentResource; +import com.bipt.intelligentapplicationorchestrationservice.gpu.model.entity.GpuResource; +import com.bipt.intelligentapplicationorchestrationservice.utils.ConfigConstants; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import org.springframework.web.client.ResourceAccessException; + +import java.util.Comparator; +import java.util.List; + +@Component +public class ResourceAllocator { + + @Autowired + private ConfigConstants config; + + //获取剩余内存 + private int getRemainingMemory(GpuResource resource){ + return resource.getGPUMaxMemory()-resource.getGPUMemorySize(); + } + + public DeploymentResource allocate( + List resources, + int requiredMemory, + String modelId, + boolean isGray + ){ + resources.sort(Comparator.comparingInt(GpuResource::getGPUMemorySize)); + + //第一轮分配 + for(GpuResource resource:resources){ + if(getRemainingMemory(resource) >= requiredMemory) { + return createResource(resource, modelId, isGray); + } + } + + //第二轮分配 + return defragmentation(resources,requiredMemory, modelId, isGray); + } + + + private DeploymentResource defragmentation( + List resources, + int requiredMemory, + String modelId, + boolean isGray + ){ + //按内存碎片大小排序(最小碎片优先) + resources.sort(Comparator.comparingDouble( + r -> (double)getRemainingMemory(r) / r.getGPUMaxMemory())); + + for(GpuResource resource:resources){ + if(getRemainingMemory(resource) >= requiredMemory){ + return createResource(resource, modelId, isGray); + } + } + throw new ResourceAccessException("GPU资源不足"); + } + + private DeploymentResource createResource(GpuResource gpu, String modelId, boolean isGray){ + String urlType = isGray ? "gray":"prod"; + String url = String.format( + config.URL_TEMPLATE, + gpu.getIp(), + config.MODEL_PORT, + modelId, + urlType + ); + return new DeploymentResource(gpu, url); + } +} diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/deploy/entity/DeployRequest.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/deploy/entity/DeployRequest.java new file mode 100644 index 0000000..b7a4282 --- /dev/null +++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/deploy/entity/DeployRequest.java @@ -0,0 +1,4 @@ +package com.bipt.intelligentapplicationorchestrationservice.deploy.entity; + +public class DeployRequest { +} diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/deploy/entity/DeployResponse.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/deploy/entity/DeployResponse.java new file mode 100644 index 0000000..28a9481 --- /dev/null +++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/deploy/entity/DeployResponse.java @@ -0,0 +1,25 @@ +package com.bipt.intelligentapplicationorchestrationservice.deploy.entity; + +public class DeployResponse { + private boolean isSuccess; + private String errorInfo; + private int status; + private T data; + + public DeployResponse(boolean b, String s, int i, T data) { + isSuccess = b; + errorInfo = s; + status = i; + this.data = data; + } + + // 成功响应 + public static DeployResponse success(T data) { + return new DeployResponse<>(true, "", 200, data); + } + + // 失败响应 + public static DeployResponse fail(int status, String error) { + return new DeployResponse<>(false, error, status, null); + } +} diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/deploy/entity/DeploymentResource.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/deploy/entity/DeploymentResource.java new file mode 100644 index 0000000..c1fb6de --- /dev/null +++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/deploy/entity/DeploymentResource.java @@ -0,0 +1,12 @@ +package com.bipt.intelligentapplicationorchestrationservice.deploy.entity; + +import com.bipt.intelligentapplicationorchestrationservice.gpu.model.entity.GpuResource; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class DeploymentResource { + private final GpuResource gpu; + private final String url; +}