cnvrg 1.9.9.9.4 → 1.10.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: abe86787c977039f70850a0c0a5dbe203930f5cf5a6bd20dc6c3b8f8ed6cb21c
4
- data.tar.gz: 4fb12784ae1d4452d71dbd069cc3be2898b3244401a801339b72ce0102da24e5
3
+ metadata.gz: 07ab3ff1cccbdc44a84d611daa11de215256e035ae6e84b624b8fc18339b20bf
4
+ data.tar.gz: f8ff99cae183a98a3be25222ba035e8501bf13c650842a083a9065ff238dacab
5
5
  SHA512:
6
- metadata.gz: 2663d0d5c0733b7fff8d20fe798fe395f5df856b444af9f51253bc31b0fefd380d78e616651ee0b4280b6d29dc9bac7564d6cd4b7c7835ad190e1e5966215b7e
7
- data.tar.gz: afe2c81bb5f884692dc5cd16b5984ab30a60c4ad27c434ed16462e307fcf867ecfaedc9e78034fb3427a1d1fc7e7bca1b47237e803fe2ec36601dac1d313b236
6
+ metadata.gz: ab831c80f088b48ada89e56a75c732afe88482444afe758b9370a60ec1085a0375c6e2835aa28a1caefd96d26be1256f9c0a3541b64aa35c9d42ec1ac248f342
7
+ data.tar.gz: d3d3f35f63876d6e7730ce728f473482635c9f07bbe482e2324cbb091865caedb3ffb7405c68d5eccecc96f2e6c6ce1fa25fea4c9998b15ab851fd6dbab115f5
@@ -212,7 +212,6 @@ module Cnvrg
212
212
  return nil
213
213
  rescue SignalException
214
214
  return false
215
-
216
215
  end
217
216
 
218
217
  end
@@ -2,13 +2,76 @@ module Cnvrg
2
2
  class API_V2 < API
3
3
  ENDPOINT_VERSION = 'v2'
4
4
 
5
+ class CnvrgAPIError < StandardError; end
6
+
5
7
  def self.endpoint_uri
6
8
  api = get_api()
7
9
  return "#{api}/#{Cnvrg::API_V2::ENDPOINT_VERSION}"
8
10
  end
9
11
 
12
+ def self.request(resource, method = 'GET', data = {}, parse_request = true)
13
+ resource = URI::encode resource
14
+ n = Netrc.read
15
+ if n['cnvrg.io'].nil?
16
+ puts 'You\'re not logged in'
17
+ puts 'Please log in via `cnvrg login`'
18
+ return
19
+ end
20
+
21
+ _, pass = n[Cnvrg::Helpers.netrc_domain]
22
+
23
+ conn = Faraday.new endpoint_uri, :ssl => {:verify => !!Helpers.is_verify_ssl}
24
+ conn.headers['Auth-Token'] = pass
25
+ conn.headers['User-Agent'] = Cnvrg::API::USER_AGENT
26
+ conn.headers['Content-Type'] = "application/json"
27
+ conn.options.timeout = 420
28
+ conn.options.open_timeout = 180
29
+
30
+ 20.times do
31
+ begin
32
+ response = send_request conn, resource, method, data
33
+ Cnvrg::API.parse_version response
34
+ is_response_success response
35
+ if parse_request
36
+ return JSON.parse(response.body)
37
+ else
38
+ return response.body
39
+ end
40
+ rescue CnvrgAPIError => e
41
+ raise e
42
+ rescue => e
43
+ Cnvrg::Logger.log_error e
44
+ sleep 0.5
45
+ retry
46
+ end
47
+ end
48
+ rescue CnvrgAPIError => e
49
+ Cnvrg::Logger.log_error e
50
+ raise e
51
+ rescue SignalException
52
+ return false
53
+ rescue => e
54
+ Cnvrg::Logger.log_error e
55
+ return nil
56
+ end
57
+
58
+ private
59
+
60
+ def self.send_request(conn, resource, method, data)
61
+ case method
62
+ when 'GET'
63
+ conn.get resource, data
64
+ when 'POST'
65
+ conn.post resource, data.to_json
66
+ when 'PUT'
67
+ conn.put resource, data.to_json
68
+ when 'DELETE'
69
+ conn.delete resource, data
70
+ end
71
+ end
72
+
10
73
  def self.is_response_success(response)
11
- raise Exception.new("Bad status in response #{response.status}") if response.status != 200
74
+ raise CnvrgAPIError.new(JSON(response.body)['errors']) if response.status != 200
12
75
  end
13
76
  end
14
- end
77
+ end
@@ -49,6 +49,7 @@ require 'cnvrg/job_cli'
49
49
  require 'cnvrg/job_ssh'
50
50
  require 'cnvrg/connect_job_ssh'
51
51
  require 'cnvrg/api_v2'
52
+ require 'rubygems/package'
52
53
 
53
54
  class Thor
54
55
  module Base
@@ -857,7 +858,7 @@ module Cnvrg
857
858
  method_option :read, :type => :boolean, :aliases => ["-r", "--read"], :default => false
858
859
  method_option :remote, :type => :boolean, :aliases => ["-h", "--remote"], :default => false
859
860
  method_option :soft, :type => :boolean, :aliases => ["-s", "--soft"], :default => false, :hide => true
860
- def clone_data(dataset_url, only_tree=false, commit=nil, query=nil, read=false, remote=false, flatten: false, relative: false, soft: false)
861
+ def clone_data(dataset_url, only_tree=false, commit=nil, query=nil, read=false, remote=false, flatten: false, relative: false, soft: false, threads: 15)
861
862
  begin
862
863
  verify_logged_in(false)
863
864
  log_start(__method__, args, options)
@@ -913,7 +914,7 @@ module Cnvrg
913
914
 
914
915
  while files['keys'].length > 0
915
916
  Cnvrg::Logger.log_info("download multiple files, #{downloaded_files.size} files downloaded")
916
- @files.download_multiple_files_s3(files, @dataset.local_path, progressbar: progressbar, read_only: read, flatten: flatten)
917
+ @files.download_multiple_files_s3(files, @dataset.local_path, progressbar: progressbar, read_only: read, flatten: flatten, threads: threads)
917
918
 
918
919
  downloaded_files += files['keys'].length
919
920
  files = @files.get_clone_chunk(commit: commit, latest_id: files['latest'])
@@ -1846,6 +1847,7 @@ module Cnvrg
1846
1847
  method_option :remote, :type => :boolean, :aliases => ["-r", "--r"], :default => false
1847
1848
  method_option :commit, :type => :string, :aliases => ["-c", "--c"], :default => nil
1848
1849
  method_option :soft, :type => :boolean, :aliases => ["-s", "--soft"], :default => false, :hide => true
1850
+ method_option :threads, :type => :numeric, :aliases => ["--threads"], :default => 15
1849
1851
  def clone(project_url)
1850
1852
  begin
1851
1853
  verify_logged_in(false)
@@ -1856,7 +1858,7 @@ module Cnvrg
1856
1858
  owner = url_parts[project_index - 1]
1857
1859
  remote = options["remote"] || false
1858
1860
  soft = options["soft"] || false
1859
-
1861
+ threads = options[:threads] || Cnvrg::Helpers.parallel_threads
1860
1862
 
1861
1863
  response = Cnvrg::API.request("users/#{owner}/projects/#{slug}/get_project", 'GET')
1862
1864
  Cnvrg::CLI.is_response_success(response)
@@ -1907,9 +1909,10 @@ module Cnvrg
1907
1909
  idx = {commit: response["result"]["commit"], tree: response["result"]["tree"]}
1908
1910
  log_message("Downloading files", Thor::Shell::Color::BLUE)
1909
1911
  progressbar = @files.create_progressbar(files.size, "Clone Progress")
1910
- @files.download_files(files, commit_sha1, progress: progressbar)
1912
+ @files.download_files(files, commit_sha1, progress: progressbar, threads: threads)
1911
1913
  progressbar.finish
1912
1914
  Project.verify_cnvrgignore_exist(project_name, remote)
1915
+ Cnvrg::Logger.log_info("Generating idx")
1913
1916
  @project.set_idx(idx)
1914
1917
  log_message("Done")
1915
1918
  log_message("Downloaded #{files.size} files")
@@ -2274,9 +2277,9 @@ module Cnvrg
2274
2277
  method_option :job_type, :type => :string, :aliases => [ "--job_type"], :default => nil, :hide=>true
2275
2278
  method_option :suppress_exceptions, :type => :boolean, :aliases => ["--suppress-exceptions"], :default => true
2276
2279
  method_option :debug_mode, :type => :boolean, :aliases => ["--debug-mode"], :default => false
2277
- method_option :chunk_size, :type => :numeric, :aliases => ["--chunk"], :default => 100
2280
+ method_option :chunk_size, :type => :numeric, :aliases => ["--chunk"], :default => 1000
2278
2281
 
2279
- def upload(link = false, sync = false, direct = false, ignore_list = "", in_exp = false, force = false, output_dir = "output", job_type = nil, job_slug = nil, suppress_exceptions = true,chunk_size=100)
2282
+ def upload(link = false, sync = false, direct = false, ignore_list = "", in_exp = false, force = false, output_dir = "output", job_type = nil, job_slug = nil, suppress_exceptions = true,chunk_size=1000)
2280
2283
  begin
2281
2284
  # we are passing "force" twice.. doesnt really make sense :\\
2282
2285
  verify_logged_in(true)
@@ -2399,7 +2402,7 @@ module Cnvrg
2399
2402
  :total => (to_upload.size + deleted.size),
2400
2403
  :autofinish => true)
2401
2404
 
2402
- buffered_errors = @files.upload_mrultiple_files(to_upload, commit_sha1, progress: progressbar, suppress_exceptions: suppress_exceptions, chunk_size: chunk_size)
2405
+ buffered_errors = @files.upload_multiple_files(to_upload, commit_sha1, progress: progressbar, suppress_exceptions: suppress_exceptions, chunk_size: chunk_size)
2403
2406
  @files.delete_files_from_server(deleted, commit_sha1, suppress_exceptions: suppress_exceptions)
2404
2407
 
2405
2408
  progressbar.finish
@@ -2973,7 +2976,7 @@ module Cnvrg
2973
2976
  method_option :git_diff, :type => :boolean, :aliases => ["--git_diff"], :default => false
2974
2977
  method_option :suppress_exceptions, :type => :boolean, :aliases => ["--suppress-exceptions"], :default => true
2975
2978
  method_option :debug_mode, :type => :boolean, :aliases => ["--debug-mode"], :default => false
2976
- method_option :chunk_size, :type => :numeric, :aliases => ["--chunk"], :default => 100
2979
+ method_option :chunk_size, :type => :numeric, :aliases => ["--chunk"], :default => 1000
2977
2980
 
2978
2981
  def sync(direct = true)
2979
2982
  verify_logged_in(true) if direct
@@ -3043,6 +3046,7 @@ module Cnvrg
3043
3046
  method_option :notify_on_error, :type => :boolean, :aliases => ["-noe", "--notify_on_error"], :default => nil
3044
3047
  method_option :notify_on_success, :type => :boolean, :aliases => ["-nos", "--notify_on_success"], :default => nil
3045
3048
  method_option :emails, :type => :string, :aliases => ["-es", "--emails"], :default => "", :desc => "additional emails to notify on success / or error, comma separated"
3049
+ method_option :wait, :type => :boolean, :aliases => ["-w", "--wait"], :default => false, :desc => "keep command session open until experiment finished to return exit status"
3046
3050
 
3047
3051
  def run(*cmd)
3048
3052
  verify_logged_in(true)
@@ -3077,6 +3081,7 @@ module Cnvrg
3077
3081
  email_notification_error = options["notify_on_error"]
3078
3082
  email_notification_success = options["notify_on_success"]
3079
3083
  emails = options["emails"]
3084
+ wait = options["wait"]
3080
3085
 
3081
3086
  if !data.present? and data_query.present?
3082
3087
  log_message("Please provide data with data_query", Thor::Shell::Color::RED)
@@ -3122,14 +3127,14 @@ module Cnvrg
3122
3127
  invoke :exec_remote, [cmd], :sync_before => sync_before, :sync_after => sync_after, :title => title, :machine_type => instance_type,
3123
3128
  :schedule => schedule, :recurring => recurring, :log => log, :email_notification => email_notification, :upload_output => upload_output, :commit => commit,
3124
3129
  :image => image, :grid => grid, :data => data, :data_commit => data_commit, :ignore => ignore, :force => force, :sync_before_terminate => sync_before_terminate,
3125
- :max_time => max_time,
3130
+ :max_time => max_time,
3126
3131
  :periodic_sync => periodic_sync, :dataset_only_tree=> dataset_only_tree,
3127
3132
  :output_dir=>output_dir, :data_query=>data_query, :git_commit =>git_commit, :git_branch=> git_branch,
3128
3133
  :restart_if_stuck =>restart_if_stuck, :local_folders => local_folders, :datasets => datasets, :prerun => prerun, :requirements => requirements,
3129
- :email_notification_error => email_notification_error, :email_notification_success => email_notification_success, :emails => emails
3134
+ :email_notification_error => email_notification_error, :email_notification_success => email_notification_success, :emails => emails, :wait => wait
3135
+
3130
3136
  return
3131
3137
  end
3132
-
3133
3138
  end
3134
3139
 
3135
3140
  desc '', '', :hide => true
@@ -3449,6 +3454,7 @@ module Cnvrg
3449
3454
  method_option :email_notification_error, :type => :boolean, :aliases => ["-noe", "--email_notification_error"], :default => true
3450
3455
  method_option :email_notification_success, :type => :boolean, :aliases => ["-nos", "--email_notification_success"], :default => true
3451
3456
  method_option :emails, :type => :string, :aliases => ["-es", "--emails"], :default => "", :desc => "additional emails to notify on success / or error"
3457
+ method_option :wait, :type => :boolean, :aliases => ["-w", "--wait"], :default => false, :desc => "keep command session open until experiment finished to return exit status"
3452
3458
 
3453
3459
  def exec_remote(*cmd)
3454
3460
 
@@ -3510,7 +3516,7 @@ module Cnvrg
3510
3516
  options_hash.except!("schedule", "recurring", "machine_type", "image", "upload_output", "grid", "data", "data_commit", "title",
3511
3517
  "local", "small", "medium", "large", "gpu", "gpuxl", "gpuxxl","max_time","dataset_only_tree",
3512
3518
  "data_query", "git_commit","git_branch", "restart_if_stuck","local_folders","output_dir", "commit", "datasets",
3513
- "requirements", "prerun", "email_notification_error", "email_notification_success", "emails")
3519
+ "requirements", "prerun", "email_notification_error", "email_notification_success", "emails", "wait")
3514
3520
  exec_options = options_hash.map {|x| "--#{x[0]}=#{x[1]}"}.flatten.join(" ")
3515
3521
  command = "#{exec_options} #{remote} #{upload_output_option} #{cmd.flatten.join(" ")}"
3516
3522
  commit_to_run = options["commit"] || nil
@@ -3588,11 +3594,37 @@ module Cnvrg
3588
3594
  end
3589
3595
 
3590
3596
  log_message(str, Thor::Shell::Color::GREEN)
3597
+
3598
+ exit_status = 0
3599
+
3600
+ if options['wait']
3601
+ while true
3602
+ tries = 0
3603
+ begin
3604
+ result = Cnvrg::API_V2.request(
3605
+ "#{project.owner}/projects/#{project.slug}/experiments/#{res["result"]["exp_url"]}/status"
3606
+ )
3607
+ exit_status = result["exit_status"]
3608
+ if exit_status
3609
+ puts "Experiment was exited with status: #{exit_status}"
3610
+ break
3611
+ else
3612
+ system("clear") || system("cls")
3613
+ puts "#{Time.current}: waiting for experiment to finish"
3614
+ sleep 3
3615
+ end
3616
+ rescue => e
3617
+ log_error(e)
3618
+ log_message("Error occurred, retrying", Thor::Shell::Color::RED)
3619
+ sleep 3
3620
+ tries += 1
3621
+ retry if tries <= 5
3622
+ end
3623
+ end
3624
+ end
3591
3625
 
3592
- exit(0)
3593
- # end
3626
+ exit(exit_status.to_i)
3594
3627
  end
3595
-
3596
3628
  rescue => e
3597
3629
  log_message("Error occurred, Aborting", Thor::Shell::Color::RED)
3598
3630
  log_error(e)
@@ -3608,6 +3640,7 @@ module Cnvrg
3608
3640
  exit(1)
3609
3641
  end
3610
3642
  end
3643
+
3611
3644
  desc 'deploy', 'Deploys model to production'
3612
3645
  method_option :small, :type => :boolean, :aliases => ["-s", "--small"], :default => false
3613
3646
  method_option :medium, :type => :boolean, :aliases => ["-m", "--medium"], :default => false
@@ -154,6 +154,7 @@ module Cnvrg
154
154
  method_option :relative, :type => :boolean, :aliases => ["-rel", "--relative"], :default => false
155
155
  method_option :flatten, :type => :boolean, :aliases => ["-f", "--flatten"], :default => false
156
156
  method_option :soft, :type => :boolean, :aliases => ["-s", "--soft"], :default => false, :hide => true
157
+ method_option :threads, :type => :numeric, :aliases => ["--threads"], :default => 15
157
158
  def clone(dataset_url)
158
159
  cli = Cnvrg::CLI.new()
159
160
  only_tree =options[:only_tree]
@@ -163,6 +164,7 @@ module Cnvrg
163
164
  remote = options[:remote]
164
165
  soft = options[:soft]
165
166
  flatten = options[:flatten]
167
+ threads = options[:threads]
166
168
  cli.clone_data(
167
169
  dataset_url,
168
170
  only_tree=only_tree,
@@ -172,7 +174,8 @@ module Cnvrg
172
174
  remote=remote,
173
175
  flatten: flatten,
174
176
  relative: options[:relative],
175
- soft: soft
177
+ soft: soft,
178
+ threads: threads
176
179
  )
177
180
  end
178
181
 
@@ -1284,11 +1284,11 @@ module Cnvrg
1284
1284
  end
1285
1285
  end
1286
1286
 
1287
- def download_multiple_files_s3(files, project_home, conflict: false, progressbar: nil, read_only:false, flatten: false)
1287
+ def download_multiple_files_s3(files, project_home, conflict: false, progressbar: nil, read_only:false, flatten: false, threads: 15)
1288
1288
  begin
1289
1289
  refresh_storage_token
1290
1290
  parallel_options = {
1291
- in_threads: ParallelThreads,
1291
+ in_threads: threads,
1292
1292
  isolation: true
1293
1293
  }
1294
1294
  Parallel.map(files["keys"], parallel_options) do |f|
@@ -723,7 +723,7 @@ module Cnvrg
723
723
  @progressbar
724
724
  end
725
725
 
726
- def download_files(files, commit, postfix: '', progress: nil)
726
+ def download_files(files, commit, postfix: '', progress: nil, threads: 15)
727
727
  return if files.blank?
728
728
  if Cnvrg::Helpers.server_version < 1
729
729
  Cnvrg::Logger.log_info("Download files from older server.")
@@ -733,7 +733,7 @@ module Cnvrg
733
733
  unless Cnvrg::CLI.is_response_success(res, false)
734
734
  raise SignalException.new("Cant download files from the server.")
735
735
  end
736
- self.download_multpile_files_s3(res['result'], @project_home, postfix: postfix, progress: progress)
736
+ self.download_multpile_files_s3(res['result'], @project_home, postfix: postfix, progress: progress, threads: threads)
737
737
  end
738
738
 
739
739
 
@@ -750,7 +750,7 @@ module Cnvrg
750
750
  conflicted.each{|file| self.delete_conflict(file); progress.progress += 1 if progress.present?}
751
751
  end
752
752
 
753
- def download_multpile_files_s3(files, project_home, postfix: '', progress: nil)
753
+ def download_multpile_files_s3(files, project_home, postfix: '', progress: nil, threads: 15)
754
754
  begin
755
755
  props = {}
756
756
  client = props[:client]
@@ -759,7 +759,7 @@ module Cnvrg
759
759
  bucket = props[:bucket]
760
760
  download_succ_count = 0
761
761
  parallel_options = {
762
- in_threads: Cnvrg::Helpers.parallel_threads,
762
+ in_threads: threads,
763
763
  isolation: true
764
764
  }
765
765
 
@@ -2,15 +2,8 @@ module Cnvrg
2
2
  module Helpers
3
3
 
4
4
  extend self
5
- def parallel_threads()
6
- threads = ENV["CNVRG_PARALLEL_THREADS"].to_i
7
-
8
-
9
- ### if empty, default will be 15 threads
10
- threads = threads > 0 ? threads : 15
11
-
12
- ### set max threads to be 100k
13
- [threads, 100000].min
5
+ def parallel_threads
6
+ 15
14
7
  end
15
8
 
16
9
  def self.parallel_options
@@ -1,3 +1,3 @@
1
1
  module Cnvrg
2
- VERSION = '1.9.9.9.4'
2
+ VERSION = '1.10.5'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cnvrg
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.9.9.9.4
4
+ version: 1.10.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yochay Ettun
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2020-07-21 00:00:00.000000000 Z
13
+ date: 2020-08-16 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: bundler