feat: Implements retrying logic for downloading models using --model-url flag

This commit is contained in:
farbod 2024-08-31 00:20:43 +03:30
parent 1e6f6554aa
commit 951084cb9f

View file

@ -2361,10 +2361,22 @@ static bool llama_download_file(const std::string & url, const std::string & pat
curl_easy_setopt(curl.get(), CURLOPT_HEADERFUNCTION, static_cast<CURLOPT_HEADERFUNCTION_PTR>(header_callback)); curl_easy_setopt(curl.get(), CURLOPT_HEADERFUNCTION, static_cast<CURLOPT_HEADERFUNCTION_PTR>(header_callback));
curl_easy_setopt(curl.get(), CURLOPT_HEADERDATA, &headers); curl_easy_setopt(curl.get(), CURLOPT_HEADERDATA, &headers);
CURLcode res = curl_easy_perform(curl.get()); int head_request_attempts = 3;
if (res != CURLE_OK) { int remaining_request_attempts = 3;
fprintf(stderr, "%s: curl_easy_perform() failed: %s\n", __func__, curl_easy_strerror(res)); int retry_delay = 2;
return false; while (remaining_request_attempts > 0){
CURLcode res = curl_easy_perform(curl.get());
if (res != CURLE_OK) {
int exponential_backoff_delay = std::pow(retry_delay, (head_request_attempts - remaining_request_attempts)) * 1000;
fprintf(stderr, "%s: curl_easy_perform() failed: %s, retrying after %d miliseconds\n", __func__, curl_easy_strerror(res), exponential_backoff_delay);
remaining_request_attempts--;
std::this_thread::sleep_for(std::chrono::milliseconds(exponential_backoff_delay));
} else if (remaining_request_attempts <= 0) {
fprintf(stderr, "%s: curl_easy_perform() failed\n", __func__);
return false;
} else {
break;
}
} }
long http_code = 0; long http_code = 0;
@ -2438,12 +2450,24 @@ static bool llama_download_file(const std::string & url, const std::string & pat
}; };
// start the download // start the download
fprintf(stderr, "%s: downloading from %s to %s (server_etag:%s, server_last_modified:%s)...\n", __func__, int download_attempts = 3;
llama_download_hide_password_in_url(url).c_str(), path.c_str(), headers.etag.c_str(), headers.last_modified.c_str()); int remaining_attempts = 3;
auto res = curl_easy_perform(curl.get()); int retry_delay = 2;
if (res != CURLE_OK) { while (remaining_attempts > 0){
fprintf(stderr, "%s: curl_easy_perform() failed: %s\n", __func__, curl_easy_strerror(res)); fprintf(stderr, "%s: trying to download model from %s to %s (server_etag:%s, server_last_modified:%s)...\n", __func__,
return false; llama_download_hide_password_in_url(url).c_str(), path.c_str(), headers.etag.c_str(), headers.last_modified.c_str());
auto res = curl_easy_perform(curl.get());
if (res != CURLE_OK) {
int exponential_backoff_delay = std::pow(retry_delay, (download_attempts - remaining_attempts)) * 1000;
fprintf(stderr, "\n%s: curl_easy_perform() failed: %s, retrying after %d miliseconnds\n", __func__, curl_easy_strerror(res), exponential_backoff_delay);
remaining_attempts--;
std::this_thread::sleep_for(std::chrono::milliseconds(exponential_backoff_delay));
} else if (remaining_attempts <= 0) {
fprintf(stderr, "%s: curl_easy_perform() failed\n", __func__);
return false;
} else {
break;
}
} }
long http_code = 0; long http_code = 0;