OpenShift AI - 使用 NVIDIA Triton Runtime 運行模型

《OpenShift / RHEL / DevSecOps 匯總目錄》
說明:本文已經在 OpenShift 4.18 + OpenShift AI 2.19 的環境中驗證

文章目錄

  • 準備 Triton Runtime 環境
    • 添加 Triton Serving Runtime
    • 運行基于 Triton Runtime 的 Model Server
  • 在 Triton Runtime 中運行模型
    • 準備模型運行環境
    • 運行 PyTorch 模型
    • 運行 ONNX 模型
    • 運行 TensorFlow 模型
  • 參考

準備 Triton Runtime 環境

添加 Triton Serving Runtime

  1. 進入 RHOAI 的 Settings -> Serving runtime 菜單。
    在這里插入圖片描述
  2. 點擊 Add serving runtime 按鈕。
  3. 在 Add serving runtime 頁面中選擇 Multi-model serving platform 和 REST。
    在這里插入圖片描述
  4. 在 YAML 區域點擊 ‘Start from scratch’,然后提供以下內容,最后 Create。
apiVersion: serving.kserve.io/v1alpha1
kind: ServingRuntime
metadata:name: triton-23.05labels:name: triton-23.05annotations:maxLoadingConcurrency: "2"openshift.io/display-name: Triton runtime - 25.05-py3
spec:supportedModelFormats:- name: kerasversion: "2" # 2.6.0autoSelect: true- name: onnxversion: "1" # 1.5.3autoSelect: true- name: pytorchversion: "1" # 1.8.0a0+17f8c32autoSelect: true- name: tensorflowversion: "1" # 1.15.4autoSelect: true- name: tensorflowversion: "2" # 2.3.1autoSelect: true- name: tensorrtversion: "7" # 7.2.1autoSelect: true- name: sklearnversion: "0" # v0.23.1autoSelect: false- name: xgboostversion: "1" # v1.1.1autoSelect: false- name: lightgbmversion: "3" # v3.2.1autoSelect: falseprotocolVersions:- grpc-v2multiModel: truegrpcEndpoint: port:8085grpcDataEndpoint: port:8001volumes:- name: shmemptyDir:medium: MemorysizeLimit: 2Gicontainers:- name: tritonimage: nvcr.io/nvidia/tritonserver:25.05-py3command:- /bin/shargs:- -c- 'mkdir -p /models/_triton_models;chmod 777 /models/_triton_models;exec tritonserver"--model-repository=/models/_triton_models""--model-control-mode=explicit""--strict-model-config=false""--strict-readiness=false""--allow-http=true""--allow-sagemaker=false"'volumeMounts:- name: shmmountPath: /dev/shmresources:requests:cpu: 500mmemory: 1Gilimits:cpu: "5"memory: 1GilivenessProbe:exec:command:- curl- --fail- --silent- --show-error- --max-time- "9"- http://localhost:8000/v2/health/liveinitialDelaySeconds: 5periodSeconds: 30timeoutSeconds: 10builtInAdapter:serverType: tritonruntimeManagementPort: 8001memBufferBytes: 134217728modelLoadingTimeoutMillis: 90000

運行基于 Triton Runtime 的 Model Server

  1. 在一個 RHOAI 項目中為 Models 設為 Multi-model serving platform 類型。
  2. 按下圖在 Models 中運行一個基于 Triton 運行時的 Model Server。
    在這里插入圖片描述
  3. 完成后可以查看 Triton Model Server 的運行情況。
$ oc get deploy
NAME                                    READY   UP-TO-DATE   AVAILABLE   AGE
modelmesh-serving-triton-model-server   1/1     1            1           24h

在這里插入圖片描述

在 Triton Runtime 中運行模型

準備模型運行環境

  1. 在 RHOAI 中創建一個項目,然后在 Models 中選擇 ‘Select multi-model’。
    在這里插入圖片描述
  2. 確保在對象存儲中有名為 ai-models 的存儲桶。
  3. 創建一個 名為 ai-models 的 Connection,連到對象存儲中名為 ai-models 的存儲桶。
    在這里插入圖片描述

運行 PyTorch 模型

  1. 將 modelmesh-minio-examples 下載到本地,然后查看位于 modelmesh-minio-examples/pytorch/cifar 目錄下所包含的文件。
$ git clone https://github.com/kserve/modelmesh-minio-examples && cd modelmesh-minio-examples/pytorch
$ tree cifar/
cifar/
├── 1
│   └── model.pt
└── config.pbtxt
  1. 將 modelmesh-minio-examples/pytorch/cifar 目錄上傳到對象存儲中的 ai-models 存儲桶中。
    在這里插入圖片描述
  2. 在 RHOAI 中的 Models 頁面里點擊 Triton Model Server 一行右側的 Deploy model 按鈕,然后按下圖部署位于對象存儲中的 cifar 模型。
    在這里插入圖片描述
  3. 完成后可以看到 cifar-triton-torch 模型的部署狀態。
    在這里插入圖片描述
  4. 查詢模型的 input 和 output 格式。
$ MODEL_NAME=cifar-triton-torch
$ MODEL_URL=$(oc get route $MODEL_NAME -ojsonpath=https://{.spec.host})/v2/models/$MODEL_NAME
$ curl -s ${MODEL_URL} | jq
{"name": "cifar-triton-torch__isvc-9f77f26bf2","versions": ["1"],"platform": "pytorch_libtorch","inputs": [{"name": "INPUT__0","datatype": "FP32","shape": ["-1","3","32","32"]}],"outputs": [{"name": "OUTPUT__0","datatype": "FP32","shape": ["-1","10"]}]
}
  1. 下載測試數據文件,然后提交給 cifar-triton-torch 模型,得到返回結果。
$ wget https://raw.githubusercontent.com/kserve/kserve/master/docs/samples/v1beta1/triton/torchscript/input.json
$ curl -s -X POST -k "${MODEL_URL}/infer" -H "Content-Type: application/json" -d @./input.json | jq
{"model_name": "cifar-triton-torch__isvc-9f77f26bf2","model_version": "1","outputs": [{"name": "OUTPUT__0","datatype": "FP32","shape": [1,10],"data": [-0.55252016,-1.7675304,0.6265609,1.4070208,0.38794953,1.3849527,-0.16314837,0.85409915,-0.6349715,-0.6840154]}]
}

運行 ONNX 模型

  1. 下載 https://ai-on-openshift.io/odh-rhoai/img-triton/card.fraud.detection.onnx 模型文件到本地。
  2. 將模型文件上傳到對象存儲的 ai-models 存儲桶下的 card-fraud-detection 文件夾中。
    在這里插入圖片描述
  3. 按下圖將 card-fraud-detection.onnx 部署模型到 Triton Model Server 中。
    在這里插入圖片描述
  4. 查看部署狀態。
    在這里插入圖片描述
  5. 查詢模型的 input 和 output 格式。
$ MODEL_NAME=card-fraud-detection
$ MODEL_URL=$(oc get route $MODEL_NAME -ojsonpath=https://{.spec.host})/v2/models/$MODEL_NAME
$ curl -s ${MODEL_URL} | jq
{"name": "card-fraud-detection-1__isvc-c0a9fa30b8","versions": ["1"],"platform": "onnxruntime_onnx","inputs": [{"name": "dense_input","datatype": "FP32","shape": ["-1","7"]}],"outputs": [{"name": "dense_3","datatype": "FP32","shape": ["-1","1"]}]
}
  1. 訪問 card-fraud-detection 模型。
$ curl -s -X POST -k "${MODEL_URL}/infer" -d '{"inputs": [{ "name": "dense_input", "shape": [1, 7], "datatype": "FP32", "data": [57.87785658389723,0.3111400080477545,1.9459399775518593,1.0,1.0,0.0,0.0]}]}' | jq
{"model_name": "card-fraud-detection__isvc-7bda50d09c","model_version": "1","outputs": [{"name": "dense_3","datatype": "FP32","shape": [1,1],"data": [0.86280495]}]
}

運行 TensorFlow 模型

  1. 將 modelmesh-minio-examples 下載到本地,然后查看位于 modelmesh-minio-examples/tensorflow 目錄下所包含的文件。
$ git clone https://github.com/kserve/modelmesh-minio-examples && cd modelmesh-minio-examples
$ tree tensorflow
tensorflow
+--- mnist
|   +--- saved_model.pb
|   +--- variables
|   |   +--- variables.data-00000-of-00001
|   |   +--- variables.index
+--- simple_string
|   +--- 1
|   |   +--- model.graphdef
|   +--- config.pbtxt
  1. 將 tensorflow 目錄上傳到對象存儲的 ai-models 存儲桶中。
    在這里插入圖片描述
  2. 在 RHOAI 中按下圖部署模型,分別使用 tensorflow/mnist 和 tensorflow/simple_string 作為部署模型的 Path。
    在這里插入圖片描述
  3. 完成后可以看到部署好的 mnist 和 simplestring 模型。
    在這里插入圖片描述
  4. 查詢每個模型的 input 和 output 格式。
$ MODEL_NAME=mnist
$ MODEL_URL=$(oc get route $MODEL_NAME -ojsonpath=https://{.spec.host})/v2/models/$MODEL_NAME
$ curl -s ${MODEL_URL} | jq
{"name": "mnist__isvc-a18e6fe55d","versions": ["1"],"platform": "tensorflow_savedmodel","inputs": [{"name": "inputs","datatype": "FP32","shape": ["-1","784"]}],"outputs": [{"name": "classes","datatype": "INT64","shape": ["-1","1"]}]
}
  1. 將以下內容保存到 mnist-test.json 文件中。
{"inputs": [{"name": "inputs","shape": [1, 784],"datatype": "FP32","data": [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.2392, 0.0118, 0.1647, 0.4627, 0.7569, 0.4627, 0.4627, 0.2392, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0549, 0.7020, 0.9608, 0.9255, 0.9490, 0.9961, 0.9961, 0.9961, 0.9961, 0.9608, 0.9216, 0.3294, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5922, 0.9961, 0.9961, 0.9961, 0.8353, 0.7529, 0.6980, 0.6980, 0.7059, 0.9961, 0.9961, 0.9451, 0.1804, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1686, 0.9216, 0.9961, 0.8863, 0.2510, 0.1098, 0.0471, 0.0000, 0.0000, 0.0078, 0.5020, 0.9882, 1.0000, 0.6784, 0.0667, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.2196, 0.9961, 0.9922, 0.4196, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5255, 0.9804, 0.9961, 0.2941, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.2471, 0.9961, 0.6196, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.8667, 0.9961, 0.6157, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.7608, 0.9961, 0.4039, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5882, 0.9961, 0.8353, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1333, 0.8627, 0.9373, 0.2275, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.3294, 0.9961, 0.8353, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.4941, 0.9961, 0.6706, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.3294, 0.9961, 0.8353, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.8392, 0.9373, 0.2353, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.3294, 0.9961, 0.8353, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.8392, 0.7804, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.3294, 0.9961, 0.8353, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0431, 0.8588, 0.7804, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.3294, 0.9961, 0.8353, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.3843, 0.9961, 0.7804, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.6353, 0.9961, 0.8196, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.3843, 0.9961, 0.7804, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.2000, 0.9333, 0.9961, 0.2941, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.3843, 0.9961, 0.7804, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.2000, 0.6471, 0.9961, 0.7647, 0.0157, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.2588, 0.9451, 0.7804, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0118, 0.6549, 0.9961, 0.8902, 0.2157, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.8392, 0.8353, 0.0784, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1804, 0.5961, 0.7922, 0.9961, 0.9961, 0.2471, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.8392, 0.9961, 0.8000, 0.7059, 0.7059, 0.7059, 0.7059, 0.7059, 0.9216, 0.9961, 0.9961, 0.9176, 0.6118, 0.0392, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.3176, 0.8039, 0.9961, 0.9961, 0.9961, 0.9961, 0.9961, 0.9961, 0.9961, 0.9882, 0.9176, 0.4706, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1020, 0.8235, 0.9961, 0.9961, 0.9961, 0.9961, 0.9961, 0.6000, 0.4078, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000]}]
}
  1. 將測試文件提交給 mnist 模型,得到返回結果。
$ curl -s -X POST -k "${MODEL_URL}/infer" -H "Content-Type: application/json" -d @./test.json | jq
{"model_name": "mnist__isvc-a18e6fe55d","model_version": "1","outputs": [{"name": "classes","datatype": "INT64","shape": [1,1],"data": [0]}]
}

參考

https://github.com/kserve/modelmesh-serving/blob/main/config/runtimes/triton-2.x.yaml
https://github.com/kserve/modelmesh-minio-examples/tree/main/pytorch/cifar

https://docs.nvidia.com/deeplearning/triton-inference-server/user-guide/docs/user_guide/model_repository.html
https://docs.nvidia.com/deeplearning/triton-inference-server/user-guide/docs/tutorials/Quick_Deploy/PyTorch/README.html
https://docs.nvidia.com/deeplearning/triton-inference-server/archives/triton_inference_server_1150/user-guide/docs/model_repository.html#pytorch-models
https://catalog.ngc.nvidia.com/orgs/nvidia/containers/tritonserver/tags

https://github.com/triton-inference-server/tutorials/tree/main/Conceptual_Guide/Part_1-model_deployment
https://github.com/triton-inference-server/server/tree/main/docs/examples

https://ai-on-openshift.io/odh-rhoai/custom-runtime-triton
https://ai-on-openshift.io/tools-and-applications/ensemble-serving/ensemble-serving/
https://ai-on-openshift.io/odh-rhoai/custom-runtime-triton/#deploying-a-model-into-it
https://github.com/rh-aiservices-bu/kserve-triton-ensemble-testing
https://github.com/rh-aiservices-bu/kserve-triton-ensemble-testing/blob/main/runtime/runtime-rest.yaml

https://kserve.github.io/website/latest/modelserving/v1beta1/triton/torchscript/

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

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

相關文章

物聯網數據安全區塊鏈服務

物聯網數據安全區塊鏈服務 下面是一個專為物聯網數據安全設計的區塊鏈服務實現,使用Python編寫并封裝為RESTful API。該服務確保物聯網設備數據的不可篡改性、可追溯性和安全性。 import hashlib import json import time from datetime import datetime from uui…

數據集-目標檢測系列- 卡車 數據集 truck >> DataBall

數據集-目標檢測系列- 卡車 數據集 truck >> DataBall貴在堅持!* 相關項目1)數據集可視化項目:gitcode: https://gitcode.com/DataBall/DataBall-detections-100s/overview2)數據集訓練、推理相關項目&…

vue/微信小程序/h5 實現react的boundary

ErrorBoundary react的boundary實現核心邏輯無法處理的情況包含函數詳細介紹getDerivedStateFromError和componentDidCatch作用為什么分開調用 代碼實現(補充其他異常捕捉)函數組件與useErrorBoundary(需自定義Hook) vue的boundar…

Day113 切換Node.js版本、多數據源配置

切換Node.js版本 1.nvm簡介nvm(Node Version Manager),在Windows上管理Node.js版本,可以在同一臺電腦上輕松管理和切換多個Node.js版本 nvm下載地址:https://github.com/coreybutler/nvm-windows/2.配置nvm安裝之后檢查nvm是否已經安裝好了&a…

應急響應靶機-linux2-知攻善防實驗室

題目: 1.提交攻擊者IP2.提交攻擊者修改的管理員密碼(明文)3.提交第一次Webshell的連接URL(http://xxx.xxx.xxx.xx/abcdefg?abcdefg只需要提交abcdefg?abcdefg)4.提交Webshell連接密碼5.提交數據包的flag16.提交攻擊者使用的后續上傳的木馬文件名稱7.提交攻擊者隱藏…

新手前端使用Git(常用命令和規范)

發一篇文章來說一下前端在開發項目的時候常用的一些git命令 注:這篇文章只說最常用的,最下面有全面的 一:從git倉庫拉取項目到本地 1:新建文件夾存放項目代碼 2:在git上復制一下項目路徑(看那個順眼復制…

【面試題】常用Git命令

【面試題】常用Git命令1. 常用Git命令1. 常用Git命令 1.git clone git clone https://gitee.com/Blue_Pepsi_Cola/straw.git 2.使用-v選項,可以參看遠程主機的網址 git remote -v origin https://ccc.ddd.com/1-java/a-admin-api.git (fetch) origin https://ccc.…

Webpack構建工具

構建工具系列 Gulp構建工具Grunt構建工具Webpack構建工具Vite構建工具 Webpack構建工具 構建工具系列前言一、安裝打包配置webpack安裝樣式加載器devtoolwebpack devtool 配置詳解常見 devtool 值及適用場景選擇建議性能影響注意事項 module處理流程module.rulesmodule.usemod…

重學前端002 --響應式網頁設計 CSS

文章目錄 css 樣式特殊說明 根據在這里 Freecodecamp 實踐,調整順序后做的總結。 css 樣式 body {background-color: red; # 跟background-image 不同時使用background-image: url(https://cdn.freecodecamp.org/curriculum/css-cafe/beans.jpg);font-family: san…

RabbitMQ簡單消息監聽和確認

如何監聽RabbitMQ隊列 簡單代碼實現RabbitMQ消息監聽 需要的依賴 <!--rabbitmq--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId><version>x.x.x</version>&l…

Docker學習筆記:Docker網絡

本文是自己的學習筆記 1、Linux中的namespace1.1、創建namespace1.2、兩個namespace互相通信2、Docker中的namespace2.1 容器中的默認Bridge3、容器的三種網絡模式1、Linux中的namespace Docker中使用了虛擬網絡技術&#xff0c;讓各個容器的網絡隔離。好像每個容器從網卡到端…

用自定義注解解決excel動態表頭導出的問題

導入的excel有固定表頭動態表頭如何解決 自定義注解&#xff1a; import java.lang.annotation.*;/*** 自定義注解&#xff0c;用于動態生成excel表頭*/ Target(ElementType.FIELD) Retention(RetentionPolicy.RUNTIME) public interface FieldLabel {// 字段中文String label(…

Android-EDLA 解決 GtsMediaRouterTestCases 存在 fail

問題描述&#xff1a;[原因]R10套件新增模塊&#xff0c;getRemoteDevice獲取遠程藍牙設備時&#xff0c;藍牙MAC為空 [對策]實際藍牙MAC非空;測試時繞過處理 1.release/ebsw_skg/skg/frameworks/base/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManage…

雙渦輪增壓器結構設計cad【5張】+設計說明書

摘要 隨著汽車制造商和消費者對動力性能的要求不斷增加&#xff0c;發動機需要在更寬的轉速范圍內提供更大的功率和扭矩。雙渦輪增壓器可以幫助實現這一目標&#xff0c;通過在不同轉速下調整渦輪的工作狀態來提供更平順的動力輸出。單一渦輪增壓器可能存在渦輪滯后和增壓延遲…

大數據輕量化流批一體架構探索實踐(一)

最近學習了解到一種輕量化&#xff0c;維護門檻較低的流批一體化的架構方式&#xff0c;雖然目前還是不太成熟&#xff0c;自己也在探索學習中。 dolphinschedulerdinkystarrocksflinkzookeper 后面我會逐步發一下這個整體架構的特點&#xff0c;以及各個組件作用&#xff0c;和…

【2025/07/04】GitHub 今日熱門項目

GitHub 今日熱門項目 &#x1f680; 每日精選優質開源項目 | 發現優質開源項目&#xff0c;跟上技術發展趨勢 &#x1f4cb; 報告概覽 &#x1f4ca; 統計項&#x1f4c8; 數值&#x1f4dd; 說明&#x1f4c5; 報告日期2025-07-04 (周五)GitHub Trending 每日快照&#x1f55…

HarmonyOS學習記錄3

HarmonyOS學習記錄3 本文為個人學習記錄&#xff0c;僅供參考&#xff0c;如有錯誤請指出。本文主要記錄ArkTS基礎語法&#xff0c;僅記錄了部分我覺得與其他語言不太類似的地方&#xff0c;具體規范請參考官方文檔。 參考官方文檔&#xff1a;https://developer.huawei.com/co…

HKS201-M24 大師版 8K60Hz USB 3.0 適用于 2 臺 PC 1臺顯示器 無縫切換 KVM 切換器

HKS201-M24 8K60Hz HDMI 2.1 2x1 KVM 切換器&#xff0c;適用于 2 臺 PC&#xff0c;帶 EDID 仿真、千兆 LAN、雙充電和 USB 3.2 Gen 1 HKS201-M24 產品概述 TESmart 重新定義智能工作空間&#xff0c;無縫雙PC控制。 真正的 8K60Hz 亮度&#xff0c;具有 EDID 穩定性和超快速…

stm32f103vct6的DAC口的輸出電壓達不到3.3V

問題&#xff1a;調試時發現自己設置的DAC在最大時達不到3.3V&#xff0c;總結了原因&#xff0c;記錄下。 原因&#xff1a;使用時&#xff0c;注意有沒有其他負載&#xff0c;有的話最好給負載獨立供電&#xff0c;不要只用STM32f103的板湊活著供電&#xff0c;我的就是這個…

java8 Collectors.mapping 使用 例子 學習

java8 Collectors.mapping 使用 例子 學習 Map<String, List<String>> colorApple appleList.stream().collect(Collectors.groupingBy(Apple::getColor, Collectors.mapping(Apple::getVariety, toList()))); colorApple.forEach((k, v) -> {System.out.prin…