模型服务

部署服务

平台支持将已编译的模型部署为服务,以便在实际应用场景中对服务进行调用。

登录至VastTrain,在“控制台”页面的左侧导航树选择“模型服务 > 部署服务”,进入“部署服务”页面,包含创建部署服务和服务列表。用户在该页面可创建部署服务、启动或删除服务。部署服务页面如图 75所示。

../../_images/model_server_total.png

图 75 部署服务

创建部署服务

创建部署服务页面如图 76所示,界面说明如表 16所示。

../../_images/create_model_server.png

图 76 创建部署服务

表 16 参数说明

参数

说明

任务名称

设置部署服务名称。

描述

对部署的服务进行简单描述。

编译任务

选择已编译的模型。

batch_size

设置模型 Batch Size。

资源类型

选择服务部署的环境。 当前不支持设置。

租赁类型

选择服务租赁类型 。当前不支持设置。

副本数

服务的数量。设置多副本可提高服务性能 。

在线体验

待服务部署完成并启动后,可在“部署服务”页面选择已部署的服务,单击“在线体验”进行体验。

../../_images/model_server_try.png

图 77 在线体验服务

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

../../_images/model_server_try_page.png

图 78 在线体验页面

服务API

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

../../_images/model_server_api.png

图 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所示。

../../_images/call_total.png

图 80 调用统计