// Copyright (C) 2019-2020 Zilliz. All rights reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance // with the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software distributed under the License // is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express // or implied. See the License for the specific language governing permissions and limitations under the License. #ifdef MILVUS_GPU_VERSION #include "scheduler/selector/FaissIVFSQ8Pass.h" #include "cache/GpuCacheMgr.h" #include "config/Config.h" #include "scheduler/SchedInst.h" #include "scheduler/Utils.h" #include "scheduler/task/SearchTask.h" #include "scheduler/tasklabel/SpecResLabel.h" #include "utils/Log.h" namespace milvus { namespace scheduler { void FaissIVFSQ8Pass::Init() { #ifdef MILVUS_GPU_VERSION server::Config& config = server::Config::GetInstance(); Status s = config.GetEngineConfigGpuSearchThreshold(threshold_); if (!s.ok()) { threshold_ = std::numeric_limits::max(); } s = config.GetGpuResourceConfigSearchResources(search_gpus_); if (!s.ok()) { throw std::exception(); } SetIdentity("FaissIVFSQ8Pass"); AddGpuEnableListener(); AddGpuSearchThresholdListener(); AddGpuSearchResourcesListener(); #endif } bool FaissIVFSQ8Pass::Run(const TaskPtr& task) { if (task->Type() != TaskType::SearchTask) { return false; } auto search_task = std::static_pointer_cast(task); if (search_task->file_->engine_type_ != (int)engine::EngineType::FAISS_IVFSQ8) { return false; } auto search_job = std::static_pointer_cast(search_task->job_.lock()); ResourcePtr res_ptr; if (!gpu_enable_) { LOG_SERVER_DEBUG_ << LogOut("[%s][%d] FaissIVFSQ8Pass: gpu disable, specify cpu to search!", "search", 0); res_ptr = ResMgrInst::GetInstance()->GetResource("cpu"); } else if (search_job->nq() < threshold_) { LOG_SERVER_DEBUG_ << LogOut("[%s][%d] FaissIVFSQ8Pass: nq < gpu_search_threshold, specify cpu to search!", "search", 0); res_ptr = ResMgrInst::GetInstance()->GetResource("cpu"); } else { LOG_SERVER_DEBUG_ << LogOut("[%s][%d] FaissIVFSQ8Pass: nq >= gpu_search_threshold, specify gpu %d to search!", "search", 0, search_gpus_[idx_]); res_ptr = ResMgrInst::GetInstance()->GetResource(ResourceType::GPU, search_gpus_[idx_]); idx_ = (idx_ + 1) % search_gpus_.size(); } auto label = std::make_shared(res_ptr); task->label() = label; return true; } } // namespace scheduler } // namespace milvus #endif