| 165 | } |
| 166 | |
| 167 | Maybe<void> LocalTensor::offload() { |
| 168 | TENSOR_OFFLOAD_CHECK(false, "offloaded"); |
| 169 | |
| 170 | // Offload to cpu mem with a cpu tensor implantation. |
| 171 | int64_t device_id = JUST(this->device())->device_id(); |
| 172 | std::shared_ptr<Tensor> cuda_tensor = shared_from_this(); |
| 173 | auto offloaded_tensor = |
| 174 | JUST(functional::Copy(cuda_tensor, "cpu", device_id, /*pin_memory=*/JUST(is_pinned()))); |
| 175 | JUST(vm::CurrentRankSync()); |
| 176 | |
| 177 | const auto& detached_tensor = |
| 178 | std::dynamic_pointer_cast<LocalTensor>(JUST(offloaded_tensor->detach())); |
| 179 | CHECK_NOTNULL_OR_RETURN(detached_tensor) << " detached_tensor must be a local tensor."; |
| 180 | offloaded_impl_ = detached_tensor->impl_; |
| 181 | |
| 182 | // Release cuda memory, but the meta data is valid. |
| 183 | auto eager_blob_obj = JUST(JUST(impl_->mut_eager_local_tensor_impl())->eager_blob_object()); |
| 184 | JUST(eager_blob_obj->DeallocateBlobDataPtr()); |
| 185 | |
| 186 | auto* vm = JUST(SingletonMaybe<VirtualMachine>()); |
| 187 | JUST(vm->ShrinkAllMem()); |
| 188 | |
| 189 | is_offloaded_ = true; |
| 190 | return Maybe<void>::Ok(); |
| 191 | } |
| 192 | |
| 193 | Maybe<void> LocalTensor::load() { |
| 194 | TENSOR_OFFLOAD_CHECK(true, "loaded"); |