---
title: 建链
description: "调用LinkLlmClusters接口在PD节点之间建立通信链路，链路主要用于KV Cache的传输。"
url: https://www.hiascend.com/document/detail/zh/canncommercial/latest/others/llmdatadistdev/llmcdv1_42_13.html
sourcePath: /source/zh/canncommercial/900/others/llmdatadistdev/llmcdv1_42_13.html
indexId: da721e5cbf9fa3e3e97bcfb49d8cae7f17db5cb4c638edd75123322f80a0936c70
---
# 建链

#### 功能介绍

调用LinkLlmClusters接口在PD节点之间建立通信链路，链路主要用于KV Cache的传输。


#### 使用场景

建链操作是节点之间进行数据传输的前提，在D2D模式中，建链接口采用类TCP建链流程，P侧初始化时提供侦听信息，由D侧发起建链。

根据业务繁忙情况，在需要调整集群PD节点配比时，通过建链扩容节点。


#### 功能示例

初始化LLM-DataDist。其中P侧需要设置侦听的Device IP和port。

```
// P侧
LlmDataDist llm_data_dist(PROMPT_CLUSTER_ID, LlmRole::kPrompt);
std::map<AscendString, AscendString> options;
options[OPTION_DEVICE_ID] = "0";
//替换为真实IP端口
options[OPTION_LISTEN_IP_INFO] = "ip:port";
options[OPTION_BUF_POOL_CFG] = R"({
"buf_cfg":[{"total_size":2097152,"blk_size":256,"max_buf_size":8192}],
"buf_pool_size": 2147483648
})";
auto ret = llm_data_dist.Initialize(options);
if (ret != LLM_SUCCESS) {
    printf("[ERROR] Initialize failed, ret = %u\n", ret);
    return -1;
}
// D侧
LlmDataDist llm_data_dist(DECODER_CLUSTER_ID, LlmRole::kDecoder);
std::map<AscendString, AscendString> options;
options[OPTION_DEVICE_ID] = "0";
options[OPTION_BUF_POOL_CFG] = R"({
"buf_pool_size": 2147483648
})";
auto ret = llm_data_dist.Initialize(options);
if (ret != LLM_SUCCESS) {
    printf("[ERROR] Initialize failed, ret = %u\n", ret);
    return -1;
}
```


在D侧调用LinkLlmClusters发起建链操作。

```
std::vector<Status> rets;
std::vector<ClusterInfo> clusters;
ClusterInfo cluster_info;
IpInfo local_ip_info;
// 替换为本地真实IP
local_ip_info.ip = "ip";
IpInfo remote_ip_info;
// 替换为对端真实IP
remote_ip_info.ip = "ip";
// 替换为P侧初始化时的侦听端口
remote_ip_info.port = "port";
cluster_info.remote_cluster_id = PROMPT_CLUSTER_ID;
cluster_info.local_ip_infos.emplace_back(std::move(local_ip_info));
cluster_info.remote_ip_infos.emplace_back(std::move(remote_ip_info));
clusters.emplace_back(std::move(cluster_info));
auto ret = llm_data_dist.LinkLlmClusters(clusters, rets);
if (ret != LLM_SUCCESS) {
    printf("[ERROR] LinkLlmClusters failed, ret = %u\n", ret);
    return -1;
}
for (const auto &inner_ret : rets) {
    if (inner_ret != LLM_SUCCESS) {
        printf("[ERROR] LinkLlmClusters failed, ret = %u\n", inner_ret);
        return -1;
    }
}
```


#### 异常处理

当调用LinkLlmClusters失败时，需排查两台机器网络是否连通，Device IP是否正确，port是否被占用。

更多异常处理请参考错误码。
