云原生 AI 工程化實踐之 FasterTransformer 加速 LLM 推理

作者:顏廷帥(瀚廷)

01 背景

OpenAI 在 3 月 15 日發布了備受矚目的 GPT4,它在司法考試和程序編程領域的驚人表現讓大家對大語言模型的熱情達到了頂點。人們紛紛議論我們是否已經跨入通用人工智能的時代。與此同時,基于大語言模型的應用也如雨后春筍般出現,為我們帶來了協同辦公、客服對話、語言翻譯、內容生成等方面前所未有的暢快體驗。

然而,當我們享受著大語言模型帶來的普惠 AI 能力時,它也給開發者們帶來了前所未有的挑戰。隨著模型不斷增大,計算量也達到了空前的高度,直接導致推理時間變長。為了解決大語言模型推理的延遲問題,業界已經提供了一些解決方案,比如 Tensorrt、FasterTransformer 和 vllm。為了幫助用戶解決云原生系統中的大語言模型推理加速問題,云原生 AI 套件引入了 FasterTransformer 推理加速方案。

本文將在 ACK 容器服務上,以 Bloom7B1 模型為例展示如何使用 FasterTransformer 進行推理加速。本例中會使用以下組件:

  • Arena

Arena 是基于 Kubernetes 的機器學習輕量級解決方案,支持數據準備、模型開發,模型訓練、模型預測的完整生命周期,提升數據科學家工作效率。同時和阿里云的基礎云服務深度集成,支持 GPU 共享、CPFS 等服務,可以運行阿里云優化的深度學習框架,最大化使用阿里云異構設備的性能和成本的效益。更多 arena 信息,可以參考云原生 AI 套件開發者使用指南 [ 1]

  • Triton Server

Triton Server為Nvidia 提供了機器學習推理引擎,可以支持 Tensorflow、Pytorch、Tensorrt 和 Fastertransformer 多種 backend。云原生 AI 套件已經將 Triton Server 加入到 Arena 中,用戶可以通過簡單的命令行或 SDK 來在云原生系統中完成 Triton Server 服務的拉起、運維和監控。更多 AI 套件中使用 Triton Server 信息,可以參考部署 PyTorch 模型推理服務 [ 2]

  • FasterTransformer

FasterTransformer 是真對于 Transofrmer 類型模型(也包括 encoder-only、decoder-only)的推理加速方案,其提供了 Kernel Fuse、Memory reuse、kv cache、量化等多種優化方案,同時也提供了 Tensor Parallel 和 Pipeline Parallel 兩種分布式推理方案。本文將介紹如何在云原生 AI 套件中使用 FasterTransformer 進行模型的推理加速。

02 環境準備

環境準備分為兩個部分,第一個部分是創建包含 GPU 的 Kubernetes 集群 [ 3] 和安裝云原生 AI 套件 [ 4] ,第二個部分是從 huggingface 官網下載 bloom-7b1 模型。

模型的下載命令如下:

git lfs install
git clone git@hf.co:bigscience/bloom-7b1

通過上面的命令,可以將 huggingface repo 中的文件下載到本地:

在這里插入圖片描述

下載完成后,我們將 bloom-71 文件夾上傳到 OSS 中,作為推理時的共享存儲,OSS 的使用可以參考開始使用 OSS [ 5]

上傳到 OSS 之后,分別創建名稱為 bloom7b1-pv 和 bloom7b1-pvc 的 PV 和 PVC,以用于推理服務的容器掛載。具體操作,請參見使用 OSS 靜態存儲卷 [ 6]

03 模型轉換

FasterTransformer 本質上是對模型的重寫,它通過 CUDA、cuDNN 和 cuBLAS 重寫了 Transformer 模型結構,因此其具有自己的模型結構和模型參數的描述方式。而我們的模型一般是通過 Pytorch、Tesorflow、Megatron 或 huggingface 這樣的訓練框架產出,其往往又具有自己單獨的一套模型結構和參數的表達,因此在使用FasterTransformer時,就需要將模型原有的 checkpoint 轉換為 FasterTransformer 的結構。

FasterTransformer 中已經支持了多種類型的轉換腳本,這里我們使用 FasterTransofrmer 提供的 examples/pytorch/gpt/utils/huggingface_bloom_convert.py。

云原生 AI 套件已經接入了上述的轉換邏輯,因此,通過如下腳本即可完成一次模型的轉換。

arena submit pytorchjob\--gpus=1\--image ai-studio-registry.cn-beijing.cr.aliyuncs.com/kube-ai/fastertransformer:torch-0.0.1\--name convert-bloom\--workers 1\--namespace default-group\--data bloom-pvc:/mnt\'python  /FasterTransformer/examples/pytorch/gpt/utils/huggingface_bloom_convert.py -i /mnt/model/bloom-7b1 -o /mnt/model/bloom-7b1-ft-fp16 -tp 2  -dt fp16 -p 64 -v'

通過 arena log 來觀察轉換的日志:

$arena logs -n default-group convert-bloom
======================= Arguments =======================- input_dir...........: /mnt/model/bloom-7b1- output_dir..........: /mnt/model/bloom-7b1-ft-fp16- tensor_para_size....: 2- data_type...........: fp16- processes...........: 64- verbose.............: True- by_shard............: False
=========================================================
loading from pytorch bin format
model file num: 2- model.pre_decoder_layernorm.bias................: shape (4096,)            | saved at /mnt/model/bloom-7b1-ft-fp16/2-gpu/model.pre_decoder_layernorm.bias.bin- model.layers.0.input_layernorm.weight...........: shape (4096,)            | saved at /mnt/model/bloom-7b1-ft-fp16/2-gpu/model.layers.0.input_layernorm.weight.bin- model.layers.0.attention.dense.bias.............: shape (4096,)            | saved at /mnt/model/bloom-7b1-ft-fp16/2-gpu/model.layers.0.attention.dense.bias.bin- model.layers.0.input_layernorm.bias.............: shape (4096,)            | saved at /mnt/model/bloom-7b1-ft-fp16/2-gpu/model.layers.0.input_layernorm.bias.bin- model.layers.0.attention.query_key_value.bias...: shape (3, 2048)        s | saved at /mnt/model/bloom-7b1-ft-fp16/2-gpu/model.layers.0.attention.query_key_value.bias.0.bin (0/2)- model.layers.0.post_attention_layernorm.weight..: shape (4096,)            | saved at /mnt/model/bloom-7b1-ft-fp16/2-gpu/model.layers.0.post_attention_layernorm.weight.bin- model.layers.0.post_attention_layernorm.bias....: shape (4096,)            | saved at /mnt/model/bloom-7b1-ft-fp16/2-gpu/model.layers.0.post_attention_layernorm.bias.bin- model.layers.0.mlp.dense_4h_to_h.bias...........: shape (4096,)            | saved at /mnt/model/bloom-7b1-ft-fp16/2-gpu/model.layers.0.mlp.dense_4h_to_h.bias.bin- model.layers.0.mlp.dense_h_to_4h.bias...........: shape (8192,)          s | saved at /mnt/model/bloom-7b1-ft-fp16/2-gpu/model.layers.0.mlp.dense_h_to_4h.bias.0.bin (0/2)- model.layers.0.attention.query_key_value.bias...: shape (3, 2048)        s | saved at /mnt/model/bloom-7b1-ft-fp16/2-gpu/model.layers.0.attention.query_key_value.bias.1.bin (1/2)

通過 arena list 命令查看轉換是否執行結束:

NAME           STATUS     TRAINER     DURATION  GPU(Requested)  GPU(Allocated)  NODE
convert-bloom  SUCCEEDED  PYTORCHJOB  3m        1               N/A             192.168.123.35

轉換完成后,會在 OSS 上創建一個 model/arena/bloom-7b1-ft-fp16 文件夾,文件中會存儲 FasterTransofrmer 所對應的 checkpoint。

04 性能對比

此時,我們的 OSS 上已經有兩份 bloom-7b1 checkpoint,一份是 bloom-7b 文件夾存儲了 huggingface 原生的 checkpoint,另一份是 bloom-7b-ft-fp16 文件夾存儲了轉換后的 FasterTransformer 的 checkpoint。我們將使用這兩份 checkpoint 進行性能對比,看一下來 FasterTransformer 是否能夠帶來性能的提升。

性能對比使用 Fastertransformer 提供的 examples/pytorch/gpt/bloom_lambada.py,我們也已經集成到了 AI 套件中。這里我們分別提交兩個性能評測命令。對 Huggingface Bloom-7b1 評測的命令:

arena submit pytorchjob\--gpus=2\--image ai-studio-registry.cn-beijing.cr.aliyuncs.com/kube-ai/fastertransformer:torch-0.0.1\--name perf-hf-bloom \--workers 1\--namespace default-group\--data bloom7b1-pvc:/mnt\'python /FasterTransformer/examples/pytorch/gpt/bloom_lambada.py \--tokenizer-path /mnt/model/bloom-7b1 \--dataset-path /mnt/data/lambada/lambada_test.jsonl \--batch-size 16 \--test-hf \--show-progress'

查看 HuggingFace 的結果:

$arena -n default-group logs -t 5 perf-hf-bloom
Accuracy: 57.5587% (2966/5153) (elapsed time: 173.2149 sec)

對 Fastertransformer Blooom-7b 評測的命令:

arena submit pytorchjob\--gpus=2\--image ai-studio-registry.cn-beijing.cr.aliyuncs.com/kube-ai/fastertransformer:torch-0.0.1\--name perf-ft-bloom \--workers 1\--namespace default-group\--data bloom7b1-pvc:/mnt\'mpirun --allow-run-as-root -n 2 python /FasterTransformer/examples/pytorch/gpt/bloom_lambada.py \--lib-path /FasterTransformer/build/lib/libth_transformer.so \--checkpoint-path /mnt/model/2-gpu \--batch-size 16 \--tokenizer-path /mnt/model/bloom-7b1 \--dataset-path /mnt/data/lambada/lambada_test.jsonl \--show-progress'

查看 FasterTransformer 的結果,可以看見帶來了 2.5 倍的性能提升。

$arena -n default-group logs -t 5 perf-ft-bloom
Accuracy: 57.6363% (2970/5153) (elapsed time: 68.7818 sec)

通過結果對比可以看見,Fastertransformer 與原生的 Huggingface 相比有比較明顯的性能提升。

05 模型部署

在這一小節,我們使用 Triton Server 對 FasterTransformer 進行部署,Triton Server 中原生并不支持 FasterTransformer 的 backend,需要我們配合 Nvidia 提供的 Fastertransformer backend 來使用。通過使用 FasterTransformer backend,Triton Server 不再進行 GPU 資源的分配,FasterTransformer backend 會根據 CUDA_VISIBLE_DEVICES 判斷當前可用 GPU 資源,并分配給對應的 RANK 來執行分布式的推理。

FasterTransformer 對應的模型 Repo 目錄如下所示:

├── model_repo
│   └── fastertransformer
│       ├── 1
│       │   └── config.ini
│       └── config.pbtxt

使用功能 Arena 的如下命令來啟動 FasterTransformer:

arena serve triton \--namespace=default-group \--version=1 \--data=bloom7b1-pvc:/mnt \--name=ft-triton-bloom \--allow-metrics \--gpus=2 \--replicas=1 \--image=ai-studio-registry.cn-beijing.cr.aliyuncs.com/kube-ai/triton_with_ft:22.03-main-2edb257e-transformers \--model-repository=/mnt/triton_repo

通過 kubectl logs,我們可以看到 triton server 的部署日志,通過日志可以看到,triton server 啟動了兩個 gpu 來進行分布式推理。

I0721 08:57:28.116291 1 pinned_memory_manager.cc:240] Pinned memory pool is created at '0x7fd264000000' with size 268435456
I0721 08:57:28.118393 1 cuda_memory_manager.cc:105] CUDA memory pool is created on device 0 with size 67108864
I0721 08:57:28.118403 1 cuda_memory_manager.cc:105] CUDA memory pool is created on device 1 with size 67108864
I0721 08:57:28.443529 1 model_lifecycle.cc:459] loading: fastertransformer:1
I0721 08:57:28.625253 1 libfastertransformer.cc:1828] TRITONBACKEND_Initialize: fastertransformer
I0721 08:57:28.625307 1 libfastertransformer.cc:1838] Triton TRITONBACKEND API version: 1.10
I0721 08:57:28.625315 1 libfastertransformer.cc:1844] 'fastertransformer' TRITONBACKEND API version: 1.10
I0721 08:57:28.627137 1 libfastertransformer.cc:1876] TRITONBACKEND_ModelInitialize: fastertransformer (version 1)
I0721 08:57:28.628304 1 libfastertransformer.cc:372] Instance group type: KIND_CPU count: 1
I0721 08:57:28.628326 1 libfastertransformer.cc:402] Sequence Batching: disabled
I0721 08:57:28.628334 1 libfastertransformer.cc:412] Dynamic Batching: disabled
I0721 08:57:28.661657 1 libfastertransformer.cc:438] Before Loading Weights:
+-------------------+-----------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Backend           | Path                                                                        | Config                                                                                                                                                        |
+-------------------+-----------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+
| fastertransformer | /opt/tritonserver/backends/fastertransformer/libtriton_fastertransformer.so | {"cmdline":{"auto-complete-config":"true","min-compute-capability":"6.000000","backend-directory":"/opt/tritonserver/backends","default-max-batch-size":"4"}} |
+-------------------+-----------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+I0721 09:01:19.653743 1 server.cc:633]
+-------------------+---------+--------+
| Model             | Version | Status |
after allocation    : free:  7.47 GB, total: 15.78 GB, used:  8.31 GB
+-------------------+---------+--------+
| fastertransformer | 1       | READY  |
+-------------------+---------+--------+I0721 09:01:19.668137 1 metrics.cc:864] Collecting metrics for GPU 0: Tesla V100-SXM2-16GB
I0721 09:01:19.668167 1 metrics.cc:864] Collecting metrics for GPU 1: Tesla V100-SXM2-16GB
I0721 09:01:19.669954 1 metrics.cc:757] Collecting CPU metrics
I0721 09:01:19.670150 1 tritonserver.cc:2264]
+----------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Option                           | Value                                                                                                                                                                                                |
+----------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| server_id                        | triton                                                                                                                                                                                               |
| server_version                   | 2.29.0                                                                                                                                                                                               |
| server_extensions                | classification sequence model_repository model_repository(unload_dependents) schedule_policy model_configuration system_shared_memory cuda_shared_memory binary_tensor_data statistics trace logging |
| model_repository_path[0]         | /mnt/triton_repo                                                                                                                                                                                     |
| model_control_mode               | MODE_NONE                                                                                                                                                                                            |
| strict_model_config              | 0                                                                                                                                                                                                    |
| rate_limit                       | OFF                                                                                                                                                                                                  |
| pinned_memory_pool_byte_size     | 268435456                                                                                                                                                                                            |
| cuda_memory_pool_byte_size{0}    | 67108864                                                                                                                                                                                             |
| cuda_memory_pool_byte_size{1}    | 67108864                                                                                                                                                                                             |
| response_cache_byte_size         | 0                                                                                                                                                                                                    |
| min_supported_compute_capability | 6.0                                                                                                                                                                                                  |
| strict_readiness                 | 1                                                                                                                                                                                                    |
| exit_timeout                     | 30                                                                                                                                                                                                   |
+----------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+I0721 09:01:19.672326 1 grpc_server.cc:4819] Started GRPCInferenceService at 0.0.0.0:8001
I0721 09:01:19.672597 1 http_server.cc:3477] Started HTTPService at 0.0.0.0:8000
I0721 09:01:19.714356 1 http_server.cc:184] Started Metrics Service at 0.0.0.0:8002

06 服務請求

啟動 forward 進行驗證:

# 使用 kubectl 啟動port-forward
kubectl  -n default-group port-forward svc/ft-triton-bloom-1-tritoninferenceserver 8001:8001

這里我們使用 Triton Server 提供的 python SDK 所編寫的腳本來向 Triton Server 發起請求。腳本中主要完成三件事情:

  • 通過 huggingface 中 bloom-7b1 對應的分詞器對 query 進行分詞和 token 轉換
  • 通過 triton server SDK 向 triton server 發起請求
  • 通過分詞器對 output token 進行轉換,拿到最終的結果
import os, sys
#from tkinter import _Padding
import numpy as np
import json
import torch
#import tritongrpcclient
import argparse
import time
from transformers import AutoTokenizer
import tritonclient.grpc as grpcclient# create tokenizer
tokenizer = AutoTokenizer.from_pretrained('/mnt/model/bloom-7b1', padding_side='right')
tokenizer.pad_token_id = tokenizer.eos_token_iddef load_image(img_path: str):"""Loads an encoded image as an array of bytes."""return np.fromfile(img_path, dtype='uint8')def tokeninze(query):# encodeencoded_inputs = tokenizer(query, padding=True, return_tensors='pt')input_token_ids = encoded_inputs['input_ids'].int()input_lengths = encoded_inputs['attention_mask'].sum(dim=-1, dtype=torch.int32).view(-1, 1)return input_token_ids.numpy().astype('uint32'), input_lengths.numpy().astype('uint32')if __name__ == "__main__":parser = argparse.ArgumentParser()parser.add_argument("--model_name",type=str,required=False,default="fastertransformer",help="Model name")parser.add_argument("--url",type=str,required=False,default="localhost:8001",help="Inference server URL. Default is localhost:8001.")parser.add_argument('-v',"--verbose",action="store_true",required=False,default=False,help='Enable verbose output')args = parser.parse_args()# 1.創建clienttry:triton_client = grpcclient.InferenceServerClient(url=args.url, verbose=args.verbose)except Exception as e:print("channel creation failed: " + str(e))sys.exit(1)output_name = "OUTPUT"# 2) 設置inputinputs = []## 2.1) input_idsquery="deepspeed is"input_ids, input_lengths = tokeninze(query)inputs.append(grpcclient.InferInput("input_ids", input_ids.shape, "UINT32"))inputs[0].set_data_from_numpy(input_ids)## 2.2) input_lengthinputs.append(grpcclient.InferInput("input_lengths", input_lengths.shape, "UINT32"))inputs[1].set_data_from_numpy(input_lengths)## 2.3) output lengthoutput_len=32output_len_np = np.array([[output_len]], dtype=np.uintc)inputs.append(grpcclient.InferInput("request_output_len", output_len_np.shape, "UINT32"))inputs[2].set_data_from_numpy(output_len_np)# 3) 設置outputoutputs = []outputs.append(grpcclient.InferRequestedOutput("output_ids"))# 4) 發起請求start_time = time.time()results = triton_client.infer(model_name=args.model_name, inputs=inputs,  outputs=outputs)latency = time.time() - start_time# 5) 結果處理:轉化為numpy 類型,計算max,轉化labeloutput0_data = results.as_numpy("output_ids")print(output0_data.shape)result = tokenizer.batch_decode(output0_data[0])print(result)

發起 client 請求命令如下:

$python3 bloom_7b_client.py 
(1, 1, 36)
['deepspeed is the speed of the ship at the time of the collision, and the\ndeepspeed of the other ship is the speed of the other ship
at the time']

07 總結

本文我們通過 Bloom-7b1 模型展示了如何在云原生 AI 套件中使用 FasterTransformer 對大語言模型進行加速,通過與 HuggingFace 的版本對比可以帶來 2.5 倍的性能提升。后續我們會逐步推出更多大模型相關的推理加速方案,以滿足不同的業務需求,大家敬請期待。

如果您對 Bloom 模型的微調訓練感興趣,您也可以點擊閱讀原文,參與實驗場景,體驗一鍵訓練大模型及部署 GPU 共享推理服務。

另外,歡迎加入云原生 AI 套件客戶交流釘釘群同我們一起探討(群號:33214567)。

相關鏈接:

[1] 云原生 AI 套件開發者使用指南

https://help.aliyun.com/zh/ack/cloud-native-ai-suite/getting-started/cloud-native-ai-component-set-user-guide

[2] 部署 PyTorch 模型推理服務

https://help.aliyun.com/zh/ack/cloud-native-ai-suite/user-guide/deploy-a-pytorch-model-as-an-inference-service?spm=a2c4g.11186623.0.0.2267225carYzgA

[3] 創建包含 GPU 的 Kubernetes 集群

https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/use-gpu-scheduling-in-ack-clusters#task-1664343

[4] 安裝云原生 AI 套件

https://help.aliyun.com/document_detail/212117.htm#task-1917487

[5] 開始使用 OSS

https://help.aliyun.com/zh/oss/getting-started/getting-started-with-oss

[6] 使用 OSS 靜態存儲卷

https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/mount-statically-provisioned-oss-volumes

點擊此處,體驗一鍵訓練大模型及部署 GPU 共享推理服務。

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

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

相關文章

ISBN號碼(NOIP2008 普及組第一題)

ISBN號碼 說明 每一本正式出版的圖書都有一個ISBN號碼與之對應,ISBN碼包括9位數字、1位識別碼和3位分隔符,其規定格式如“x-xxx-xxxxx-x”,其中符號“-”就是分隔符(鍵盤上的減號),最后一位是識別碼&#x…

CCF C3 走進百度:大模型與可持續生態發展

2023年8月10日,由CCF CTO Club發起的第22期C活動在百度北京總部進行,以“AI大語言模型技術與生態發展”主題,50余位企業界、學界專家、研究人員就此進行深入探討。 CCF C走進百度 本次活動,CCF秘書長唐衛清與百度集團副總裁、深…

如何保證數據傳輸的安全?

要確保數據傳輸的安全,您可以采取以下措施: 使用加密協議:使用安全的傳輸協議,如HTTPS(HTTP over SSL/TLS)或其他安全協議,以保護數據在傳輸過程中的安全性。加密協議可以有效防止數據被竊聽或篡改。 強化身份驗證&…

3種獲取OpenStreetMap數據的方法【OSM】

OpenStreetMap 是每個人都可以編輯的世界地圖。 這意味著你可以糾正錯誤、添加新地點,甚至自己為地圖做出貢獻! 這是一個社區驅動的項目,擁有數百萬注冊用戶。 這是一個社區驅動的項目,旨在在開放許可下向每個人提供所有地理數據。…

【云計算原理及實戰】初識云計算

該學習筆記取自《云計算原理及實戰》一書,關于具體描述可以查閱原本書籍。 云計算被視為“革命性的計算模型”,因為它通過互聯網自由流通使超級計算能力成為可能。 2006年8月,在圣何塞舉辦的SES(捜索引擎戰略)大會上&a…

Sentinel 規則持久化

文章目錄 Sentinel 規則持久化一、修改order-service服務1.引入依賴2.配置nacos地址 第二步修改非常麻煩,可以略過,直接使用已經打好包的來使用二、修改sentinel-dashboard源碼1. 解壓2. 修改nacos依賴3. 添加nacos支持4. 修改nacos地址5. 配置nacos數據…

HCIP第五節------------------------------------------ospf

一、OSPF基礎 1、動態路由分類 2、距離矢量協議 運行距離矢量路由協議的路由器周期性地泛洪自己的路由表。通過路由的交互,每臺路由器都從相鄰的路由器學習到路由,并且加載進自己的路由表中,然后再通告給其他相鄰路由器。 對于網絡中的所有…

Django框架使用定時器-APScheduler實現定時任務:django實現簡單的定時任務

一、系統環境依賴 系統:windows10 python: python3.9.0 djnago3.2.0 APScheduler3.10.1 二、django項目配置 1、創建utils包,在包里面創建schedulers包 utils/schedulers/task.py #1、設置 Django 環境,就可以導入項目的模型類這些了 …

AR/VR眼鏡轉接器方案,實現同時傳輸視頻快充方案

簡介 虛擬現實頭戴顯示器設備,簡稱VR頭顯VR眼鏡,是利用仿真技術與計算機圖形學人機接口技術多媒體技術傳感技術網絡技術等多種技術集合的產品,是借助計算機及最新傳感器技術創造的一種嶄新的人機交互手段。VR頭顯VR眼鏡是一個跨時代的產品。不…

AgentBench——AI智能體基準測試和排行榜

如果您有興趣了解有關如何對AI大型語言模型或LLM進行基準測試的更多信息,那么一種新的基準測試工具Agent Bench已成為游戲規則的改變者。這個創新工具經過精心設計,將大型語言模型列為代理,對其性能進行全面評估。該工具的首次亮相已經在AI社區掀起了波瀾,揭示了ChatGPT-4目…

Selenium 測試用例編寫

編寫Selenium測試用例就是模擬用戶在瀏覽器上的一系列操作,通過腳本來完成自動化測試。 編寫測試用例的優勢: 開源,免費。 支持多種瀏覽器 IE,Firefox,Chrome,Safari。 支持多平臺 Windows,Li…

day-23 代碼隨想錄算法訓練營(19)part09

669.修剪二叉搜索樹 思路一:根據二叉搜索樹的特性進行中間值與去區間值判斷,有三種情況:1.在區間中,所以左右子樹都可能在區間中; 2.在區間外面的左側,必然只有右子樹可能存在區間中;3.在區間外…

Spring中JavaBean的生命周期及模式

( 本篇文章大部分講述了是底層知識,理念及原理 ) ( 如果只想了解,看我標記的重點即可,如果想明白其中原理,請耐心看完,對你大有受益 ) 目錄 一、簡介 ( 1 ) 是什么 ( 2 ) 背景概述 ( 3 ) 作用 二、生命周期 2.1 …

【計算機視覺|生成對抗】StackGAN:使用堆疊生成對抗網絡進行文本到照片逼真圖像合成

本系列博文為深度學習/計算機視覺論文筆記,轉載請注明出處 標題:StackGAN: Text to Photo-realistic Image Synthesis with Stacked Generative Adversarial Networks 鏈接:[1612.03242] StackGAN: Text to Photo-realistic Image Synthesis…

ViewFs And Federation On HDFS

序言 ViewFs 是在Federation的基礎上提出的,用于通過一個HDFS路徑來訪問多個NameSpace,同時與ViewFs搭配的技術是client-side mount table(這個就是具體的規則配置信息可以放置在core.xml中,也可以放置在mountTable.xml中). 總的來說ViewFs的其實就是一個中間層,用于去連接不…

Vue3 setup語法糖 解決富文本編輯器上傳圖片64位碼過長問題 quill-image-extend-module

引言&#xff1a; 富文本編輯器傳圖片會解碼成64位&#xff0c;非常長導致數據庫會報錯第一種方法&#xff1a;將數據庫類型改成 mediumtext第二種辦法&#xff1a;本文中的方法 說明&#xff0c;本周文所用語法糖為Vue3 setup語法&#xff0c;即<script setup> 思路 攔…

HIVE SQL通過Lateral View + explode實現列轉行

原表&#xff1a; abAndy<碟中諜>,<諜影重重>,<007>MOMO<小鞋子>,<朋友啊你的家在哪里> 實現效果 abAndy<碟中諜>Andy<諜影重重>Andy<007>MOMO<小鞋子>MOMO<朋友啊你的家在哪里> 實現代碼&#xff1a; selec…

STM32 F103C8T6學習筆記8:0.96寸單色OLED顯示屏顯示字符

使用STM32F103 C8T6 驅動0.96寸單色OLED顯示屏: OLED顯示屏的驅動&#xff0c;在設計開發中OLED顯示屏十分常見&#xff0c;因此今日學習一下。一篇文章從程序到顯示都講通。 文章提供源碼、原理解釋、測試工程下載&#xff0c;測試效果圖展示。 目錄 OLED驅動原理—IIC通信…

無涯教程-Perl - undef函數

描述 此函數未定義EXPR的值。用于標量,列表,哈希,函數或類型范圍。在帶有諸如undef $hash {$key}之類的語句的哈希上使用&#xff1b;實際上將指定鍵的值設置為未定義的值。 如果要從哈希中刪除元素,請使用delete函數。 語法 以下是此函數的簡單語法- undef EXPRundef返回…

Java進階篇--迭代器模式

目錄 同步迭代器&#xff08;Synchronous Iterator&#xff09;&#xff1a; Iterator 接口 常用方法&#xff1a; 注意&#xff1a; 擴展小知識: 異步迭代器&#xff08;Asynchronous Iterator&#xff09;&#xff1a; 常用的方法 注意&#xff1a; 總結&#xff1a…