src/
Coverage:
low: ≥ 0%
medium: ≥ 75.0%
high: ≥ 90.0%
Lines:
48 / 90
53.3%
Branches:
42 / 136
30.9%
Functions:
5 / 13
38.5%

framework/pytorch/op_base.cc
Line Branch Exec Source
1 #include "framework/pytorch/op_base.h"
2
3 #include <torch/extension.h>
4
5 #include "framework/pytorch/op_internal.h"
6
7 namespace recstore {
8 namespace framework {
9 namespace {
10
11 32 torch::Tensor emb_read_torch(const torch::Tensor& keys, int64_t embedding_dim) {
12 32 return std::get<0>(CachedReadTorch(keys, embedding_dim));
13 }
14
15 ✗ void emb_update_torch(const torch::Tensor& keys, const torch::Tensor& grads) {
16
0/2
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ throw std::runtime_error(
17 "emb_update_torch is deprecated. Use the Python-based sparse "
18 ✗ "optimizer.");
19 }
20
21 2 void emb_update_table_torch(const std::string& table_name,
22 const torch::Tensor& keys,
23 const torch::Tensor& grads) {
24
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
2 TORCH_CHECK(!table_name.empty(), "table_name must be non-empty");
25
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 CheckRows(keys, grads);
26
27
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
2 if (keys.size(0) == 0) {
28 ✗ return;
29 }
30
31
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 torch::Tensor cpu_keys = ToCpuTensor(keys);
32
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 torch::Tensor cpu_grads = ToCpuTensor(grads);
33
34
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 base::RecTensor rec_keys = ToRecTensor(cpu_keys, base::DataType::UINT64);
35
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 base::RecTensor rec_grads = ToRecTensor(cpu_grads, base::DataType::FLOAT32);
36
37
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
4 GetConcreteKVClientOp()->EmbUpdateCached(
38
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
4 table_name, rec_keys, rec_grads, CacheActions(keys, grads.size(1)));
39 2 }
40
41 ✗ int64_t emb_update_async_torch(const std::string& table_name,
42 const torch::Tensor& keys,
43 const torch::Tensor& grads) {
44
0/2
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ TORCH_CHECK(!table_name.empty(), "table_name must be non-empty");
45
0/2
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ CheckRows(keys, grads);
46
47
0/2
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ torch::Tensor cpu_keys = ToCpuTensor(keys);
48
0/2
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ torch::Tensor cpu_grads = ToCpuTensor(grads);
49
0/2
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ auto kv_op = GetConcreteKVClientOp();
50
0/2
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ const uint64_t update_id = kv_op->EmbUpdateAsync(
51 table_name,
52
0/2
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ ToRecTensor(cpu_keys, base::DataType::UINT64),
53
0/2
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ ToRecTensor(cpu_grads, base::DataType::FLOAT32),
54
0/4
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ CacheActions(keys, grads.size(1)));
55 ✗ return static_cast<int64_t>(update_id);
56 ✗ }
57
58 ✗ void emb_update_wait_torch(int64_t update_id) {
59
0/2
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ TORCH_CHECK(update_id > 0, "update_id must be positive");
60
0/2
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ GetConcreteKVClientOp()->WaitForEmbUpdate(static_cast<uint64_t>(update_id));
61 ✗ }
62
63 10 int64_t init_embedding_table_torch(
64 const std::string& table_name,
65 int64_t num_embeddings,
66 int64_t embedding_dim,
67 int64_t table_id = 0) {
68
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
10 TORCH_CHECK(!table_name.empty(), "table_name must be non-empty");
69
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
10 TORCH_CHECK(num_embeddings > 0, "num_embeddings must be positive");
70
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
10 TORCH_CHECK(embedding_dim > 0, "embedding_dim must be positive");
71
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
10 TORCH_CHECK(table_id >= 0, "table_id must be non-negative");
72
73 10 EmbeddingTableConfig cfg{};
74 10 cfg.num_embeddings = static_cast<uint64_t>(num_embeddings);
75 10 cfg.embedding_dim = static_cast<uint64_t>(embedding_dim);
76 10 cfg.table_id = static_cast<uint64_t>(table_id);
77
78
2/4
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 10 times.
✗ Branch 6 not taken.
30 return GetConcreteKVClientOp()->InitEmbeddingTableCached(
79
1/2
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
30 table_name, cfg, CacheActions());
80 }
81
82 ✗ bool save_checkpoint_torch(const std::string& path,
83 const std::string& metadata) {
84
0/2
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ TORCH_CHECK(!path.empty(), "checkpoint path must be non-empty");
85
0/2
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ TORCH_CHECK(!metadata.empty(), "checkpoint metadata must be non-empty");
86
0/2
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ return GetKVClientOp()->SaveCheckpoint(path, metadata);
87 }
88
89 ✗ bool load_checkpoint_torch(const std::string& path,
90 const std::string& metadata) {
91
0/2
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ TORCH_CHECK(!path.empty(), "checkpoint path must be non-empty");
92
0/2
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ TORCH_CHECK(!metadata.empty(), "checkpoint metadata must be non-empty");
93
0/2
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ return GetConcreteKVClientOp()->LoadCheckpointCached(
94
0/2
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ path, metadata, CacheActions());
95 }
96
97 18 void emb_write_torch(const torch::Tensor& keys, const torch::Tensor& values) {
98
1/2
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
18 CheckRows(keys, values);
99
100
2/4
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 18 times.
18 if (keys.size(0) == 0) {
101 ✗ return;
102 }
103
104
1/2
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
18 torch::Tensor cpu_keys = ToCpuTensor(keys);
105
1/2
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
18 torch::Tensor cpu_values = ToCpuTensor(values);
106
107
1/2
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
18 base::RecTensor rec_keys = ToRecTensor(cpu_keys, base::DataType::UINT64);
108
1/2
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
18 base::RecTensor rec_values = ToRecTensor(cpu_values, base::DataType::FLOAT32);
109
110
2/4
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 18 times.
✗ Branch 6 not taken.
36 GetConcreteKVClientOp()->EmbWriteCached(
111
2/4
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 18 times.
✗ Branch 5 not taken.
36 rec_keys, rec_values, CacheActions(keys, values.size(1)));
112 18 }
113
114 ✗ void set_ps_config_torch(const std::string& host, int64_t port) {
115
0/2
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ auto kv_op = GetConcreteKVClientOp();
116
0/2
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ kv_op->SetPSConfig(host, static_cast<int>(port));
117 ✗ }
118
119 ✗ void set_ps_backend_torch(const std::string& backend) {
120
0/2
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ auto kv_op = GetConcreteKVClientOp();
121
0/2
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ kv_op->SetPSBackend(backend);
122 ✗ }
123
124 ✗ std::string current_ps_backend_torch() {
125
0/2
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ auto kv_op = GetConcreteKVClientOp();
126
0/2
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ return kv_op->CurrentPSBackend();
127 ✗ }
128
129 } // namespace
130
131 16 void RegisterBaseOps(torch::Library& m) {
132
1/2
✓ Branch 2 taken 16 times.
✗ Branch 3 not taken.
16 m.def("emb_read", emb_read_torch);
133
1/2
✓ Branch 2 taken 16 times.
✗ Branch 3 not taken.
16 m.def("emb_update", emb_update_torch);
134
1/2
✓ Branch 2 taken 16 times.
✗ Branch 3 not taken.
16 m.def("emb_update_table", emb_update_table_torch);
135
1/2
✓ Branch 2 taken 16 times.
✗ Branch 3 not taken.
16 m.def("emb_update_async", emb_update_async_torch);
136
1/2
✓ Branch 2 taken 16 times.
✗ Branch 3 not taken.
16 m.def("emb_update_wait", emb_update_wait_torch);
137
1/2
✓ Branch 2 taken 16 times.
✗ Branch 3 not taken.
16 m.def("init_embedding_table", init_embedding_table_torch);
138
1/2
✓ Branch 2 taken 16 times.
✗ Branch 3 not taken.
16 m.def("save_checkpoint", save_checkpoint_torch);
139
1/2
✓ Branch 2 taken 16 times.
✗ Branch 3 not taken.
16 m.def("load_checkpoint", load_checkpoint_torch);
140
1/2
✓ Branch 2 taken 16 times.
✗ Branch 3 not taken.
16 m.def("emb_write", emb_write_torch);
141
1/2
✓ Branch 2 taken 16 times.
✗ Branch 3 not taken.
16 m.def("set_ps_config", set_ps_config_torch);
142
1/2
✓ Branch 2 taken 16 times.
✗ Branch 3 not taken.
16 m.def("set_ps_backend", set_ps_backend_torch);
143
1/2
✓ Branch 2 taken 16 times.
✗ Branch 3 not taken.
16 m.def("current_ps_backend", current_ps_backend_torch);
144 16 }
145
146 } // namespace framework
147 } // namespace recstore
148