模型服务
部署服务
平台支持将已编译的模型部署为服务,以便在实际应用场景中对服务进行调用。
登录至VastTrain,在“控制台”页面的左侧导航树选择“模型服务 > 部署服务”,进入“部署服务”页面,包含创建部署服务和服务列表。用户在该页面可创建部署服务、启动或删除服务。部署服务页面如图 75所示。

图 75 部署服务
创建部署服务

图 76 创建部署服务
参数 |
说明 |
---|---|
任务名称 |
设置部署服务名称。 |
描述 |
对部署的服务进行简单描述。 |
编译任务 |
选择已编译的模型。 |
batch_size |
设置模型 Batch Size。 |
资源类型 |
选择服务部署的环境。 当前不支持设置。 |
租赁类型 |
选择服务租赁类型 。当前不支持设置。 |
副本数 |
服务的数量。设置多副本可提高服务性能 。 |
在线体验
待服务部署完成并启动后,可在“部署服务”页面选择已部署的服务,单击“在线体验”进行体验。

图 77 在线体验服务
在线体验页面如图 78所示。

图 78 在线体验页面
服务API
待服务部署完成并启动后,可在“部署服务”页面选择已部署的服务,单击“复制API”复制服务的API地址,以便对服务进行体验或调用。

图 79 服务API
服务API使用示例如下所示。
Pyrhon 示例
Python示例如下所示。其中,“url”为 服务API地址,“headers”中的“xxxx” 为 创建的API Key,请根据实际情况替换。API Key 为 服务访问鉴权,可在“系统工具 > API Keys”页面进行创建即可。
import json
import requests # type: ignore
rsp = requests.post(
url="https://infer.zyaidc.com/llm-train/2/api/v1/chat/completions",
headers={"x-vast-authorization": "xxxxxxxxxxxxxx"},
json={
"model": "Assistant",
"messages": [{"role": "user", "content": "说下你的由来?"}],
"temperature": 0,
"top_p": 1,
"n": 1,
"stream": True,
"stop": [],
"max_tokens": 2048,
"presence_penalty": 0,
"frequency_penalty": 0,
"with_prompt": False,
},
stream=True,
verify=False,
)
# 流式读取
print(rsp.status_code)
for line in rsp.iter_lines():
if line:
if b"data: " in line:
line = line[6:]
print(line)
Golang 示例
Golang 示例如下所示。其中,“url”为 服务API地址,“authToken” 为 创建的API Key,请根据实际情况替换。API Key 为 服务访问鉴权,可在“系统工具 > API Keys”页面进行创建即可。
package main
import (
"bufio"
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
"os"
)
func main() {
url := "https://infer.zyaidc.com/llm-train/2/api/v1/chat/completions"
authToken := "xxxxxxxxxxxxxx"
data := map[string]interface{}{
"model": "Assistant",
"messages": []map[string]string{{"role": "user", "content": "说下你的由来?"}},
"temperature": 0,
"top_p": 1,
"n": 1,
"stream": true,
"stop": []string{},
"max_tokens": 2048,
"presence_penalty": 0,
"frequency_penalty": 0,
"with_prompt": false,
}
jsonData, err := json.Marshal(data)
if err != nil {
fmt.Println("Error marshaling JSON:", err)
return
}
req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
if err != nil {
fmt.Println("Error creating request:", err)
return
}
req.Header.Set("x-vast-authorization", authToken)
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
fmt.Println("Error making request:", err)
return
}
defer resp.Body.Close()
fmt.Println("Status Code:", resp.StatusCode)
reader := bufio.NewReader(resp.Body)
for {
line, err := reader.ReadBytes('\n')
if err == io.EOF {
break
}
if err != nil {
fmt.Println("Error reading response:", err)
break
}
if bytes.HasPrefix(line, []byte("data: ")) {
line = line[6:]
}
fmt.Println(string(line))
}
}
C++ 示例
C++ 示例如下所示。其中,“url”为 服务API地址,“authToken” 为 创建的API Key,请根据实际情况替换。API Key 为 服务访问鉴权,可在“系统工具 > API Keys”页面进行创建即可。
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <map>
#include <curl/curl.h>
#include <json/json.h>
using namespace std;
// 定义一个结构体来存储JSON数据
struct Data {
string model;
vector<map<string, string>> messages;
double temperature;
double top_p;
int n;
bool stream;
string stop;
int max_tokens;
double presence_penalty;
double frequency_penalty;
bool with_prompt;
};
// 将结构体转换为JSON字符串的函数
string StructToJson(const Data& data) {
Json::Value root;
root["model"] = data.model;
Json::Value messagesArray;
for (const auto& message : data.messages) {
Json::Value messageObject;
for (const auto& pair : message) {
messageObject[pair.first] = pair.second;
}
messagesArray.append(messageObject);
}
root["messages"] = messagesArray;
root["temperature"] = data.temperature;
root["top_p"] = data.top_p;
root["n"] = data.n;
root["stream"] = data.stream;
root["stop"] = data.stop;
root["max_tokens"] = data.max_tokens;
root["presence_penalty"] = data.presence_penalty;
root["frequency_penalty"] = data.frequency_penalty;
root["with_prompt"] = data.with_prompt;
Json::StreamWriterBuilder builder;
builder["indentation"] = "";
string jsonStr = Json::writeString(root, builder);
return jsonStr;
}
// CURL写入回调函数
static size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp) {
((string*)userp)->append((char*)contents, size * nmemb);
return size * nmemb;
}
int main() {
string url = "https://infer.zyaidc.com/llm-train/2/api/v1/chat/completions";
string authToken = "xxxxxxxxxxxxxx";
// 初始化数据
Data data;
data.model = "Assistant";
data.messages.push_back({{"role", "user"}, {"content", "说下你的由来?"}});
data.temperature = 0;
data.top_p = 1;
data.n = 1;
data.stream = true;
data.stop = [];
data.max_tokens = 2048;
data.presence_penalty = 0;
data.frequency_penalty = 0;
data.with_prompt = false;
// 将结构体转换为JSON字符串
string jsonData = StructToJson(data);
// 初始化CURL
CURL *curl;
CURLcode res;
curl_global_init(CURL_GLOBAL_DEFAULT);
curl = curl_easy_init();
if(curl) {
// 设置请求的URL
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
// 设置HTTP头信息,包括认证令牌和内容类型
struct curl_slist *headers = NULL;
headers = curl_slist_append(headers, ("Authorization: Bearer " + authToken).c_str());
headers = curl_slist_append(headers, "Content-Type: application/json");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
// 设置POST数据
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, jsonData.c_str());
// 设置写入回调函数
string response;
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
// 执行请求
res = curl_easy_perform(curl);
// 检查错误
if(res != CURLE_OK) {
cerr << "CURL error: " << curl_easy_strerror(res) << endl;
} else {
cout << "Status Code: " << response << endl;
}
// 清理资源
curl_easy_cleanup(curl);
curl_slist_free_all(headers);
}
curl_global_cleanup();
return 0;
}
调用统计
平台支持查看不同服务的调用次数、调用量统计以及服务的计费情况。
登录至VastTrain,在“控制台”页面的左侧导航树选择“模型服务 > 调用统计”,进入“调用统计”页面。用户在该页面查看我的服务调用量、我的服务计费以及预置服务计费等。调用统计页面如图 80所示。

图 80 调用统计