cnvrg 0.4.0 → 0.4.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d1d1df0dbab52f8c30f1a3e149f04ce2736b7f1c
4
- data.tar.gz: 6ee10285e341bffd5436c79bdd3d6036fc355b02
3
+ metadata.gz: 5feadd09ac750893368f8ce797dab118bb7b2b00
4
+ data.tar.gz: 2b1ecc2d4ac59d49dae305e86063bdf3cf78666f
5
5
  SHA512:
6
- metadata.gz: 2416fe3163e8160c1c5c8d9c93e77ccbd4ba388f9bc5ffceb4876c54fb509a5dac7acbb99b81c528717759aa2216d301aaf5eca1fca7a00989538a6428d8d22a
7
- data.tar.gz: 100b34a24b210d0ad3de434c79108d02d8aa954b9102d9c33f137674c7906bd23d011929a16d4c46e6d6abadc2ef2b308cd9a390f2beee1f01003aa28f460c8d
6
+ metadata.gz: b41e7bf46edf0a5fc7f6f111fa59769312412afebe55e497cb32522f87fb060f630767adae7959ebcac01959f6f100a464efc8364cd47078162c2794cd987100
7
+ data.tar.gz: 9e4aac7444147003fb95d65a44a4490b463e98b1897cfce86636330ca8af1686e629acec25ca6f345c32b70725fe328a4da09d87de2642b102a8578e71b48e74
@@ -22,6 +22,7 @@ require 'cnvrg/dataset'
22
22
  require 'cnvrg/datafiles'
23
23
  require 'cnvrg/data'
24
24
  require 'cnvrg/ssh'
25
+ require 'cnvrg/result'
25
26
  require 'logstash-logger'
26
27
  require 'cnvrg/job'
27
28
  require 'docker'
@@ -68,7 +69,6 @@ class Thor
68
69
  stop_on_unknown = Thor.stop_on_unknown_option? config[:current_command]
69
70
  opts = Thor::Options.new(parse_options, hash_options, stop_on_unknown)
70
71
  real_options = []
71
-
72
72
  real_args = [].replace(array_options)
73
73
  if local_options.is_a? (Array) and !local_options.empty? and args.empty?
74
74
  array_options.each_with_index do |p, i|
@@ -1579,52 +1579,47 @@ module Cnvrg
1579
1579
  response = @project.clone(remote, commit_to_clone)
1580
1580
  Cnvrg::CLI.is_response_success response
1581
1581
  working_dir = project_home
1582
- docker_image = response["result"]["image"]
1583
- current_commit = response["result"]["commit"]
1584
1582
  idx = {commit: response["result"]["commit"], tree: response["result"]["tree"]}
1585
1583
  File.open(working_dir + "/.cnvrg/idx.yml", "w+") {|f| f.write idx.to_yaml}
1586
- if !docker_image.nil? and !docker_image.empty? and !remote
1587
- local_images = Docker::Image.all
1588
- docker_image_local = local_images.map {|x| x.info["RepoTags"]}.flatten.select {|y| y.eql? "#{docker_image}:latest"}.flatten
1589
- if docker_image_local.size == 0
1590
- if yes? "Image wasn't found locally, pull image from cnvrg repository?", Thor::Shell::Color::YELLOW
1591
- image = pull(docker_image)
1592
- if image
1593
- log_message("downloaded image: #{docker_image}", Thor::Shell::Color::BLUE)
1594
- @image = Images.new(working_dir, docker_image)
1595
- else
1596
- log_message("Could not create a new project with docker, image was not found", Thor::Shell::Color::RED)
1597
- @project.revert(working_dir)
1598
- exit(1)
1599
- end
1600
- end
1601
1584
 
1602
- elsif docker_image_local.size == 1
1603
- log_message("found image: #{docker_image_local[0]}, setting it up..", Thor::Shell::Color::BLUE)
1604
- @image = Images.new(working_dir, docker_image_local[0])
1605
- elsif docker_image_local.size > 1
1606
- log_message("found #{docker_image_local.size} images, choose the image name you want to use", Thor::Shell::Color::BLUE)
1607
- image_name = ask "#{docker_image_local.join("\n")}\n", Thor::Shell::Color::BLUE
1608
- @image = Images.new(working_dir, image_name)
1609
- end
1585
+ log_message("Downloading files", Thor::Shell::Color::BLUE)
1586
+ files = response["result"]["files"]
1610
1587
 
1611
- end
1588
+ if !files.nil?
1589
+ begin
1590
+ download_result = @files.download_multiple_files_s3(files, project_home)
1612
1591
 
1613
- successful_changes = []
1614
- log_message("Downloading files", Thor::Shell::Color::BLUE)
1615
- if !response["result"]["tree"].nil?
1616
- parallel_options = {
1617
- :progress => {
1618
- :title => "Download Progress",
1619
- :progress_mark => '=',
1620
- :format => "%b>>%i| %p%% %t",
1621
- :starting_at => 0,
1622
- :total => response["result"]["tree"].size,
1623
- :autofinish => true
1624
- },
1625
- in_processes: ParallelProcesses,
1626
- }
1592
+ rescue Interrupt
1593
+ log_message("Couldn't download, Rolling Back all changes.", Thor::Shell::Color::RED)
1594
+
1595
+ @files.revoke_clone(project_home)
1596
+ return
1597
+ end
1598
+ Project.verify_cnvrgignore_exist(project_name, remote)
1599
+ if !download_result.is_success?
1600
+ log_message(download_result.e_msg, download_result.msg_color, false)
1601
+ log_message(download_result.e_msg_backtrace, download_result.msg_color, false)
1602
+
1603
+ @files.revoke_clone(project_home)
1604
+ end
1605
+ log_message(download_result.msg, download_result.msg_color)
1606
+ else
1607
+ current_commit = response["result"]["commit"]
1608
+ if !response["result"]["tree"].nil?
1609
+ parallel_options = {
1610
+ :progress => {
1611
+ :title => "Download Progress",
1612
+ :progress_mark => '=',
1613
+ :format => "%b>>%i| %p%% %t",
1614
+ :starting_at => 0,
1615
+ :total => response["result"]["tree"].size,
1616
+ :autofinish => true
1617
+ },
1618
+ in_processes: ParallelProcesses,
1619
+ in_thread: ParallelThreads
1620
+ }
1627
1621
  begin
1622
+ successful_changes =[]
1628
1623
  is_success = true
1629
1624
  clone_result = Parallel.map((response["result"]["tree"]), parallel_options) do |f|
1630
1625
 
@@ -1635,51 +1630,55 @@ module Cnvrg
1635
1630
  f
1636
1631
  successful_changes << relative_path
1637
1632
  else
1638
- is_success = false
1633
+ is_success =false
1639
1634
  log_message("Could not create directory: #{f[0]}", Thor::Shell::Color::RED)
1640
1635
  raise Parallel::Kill
1641
1636
  end
1642
1637
  else
1643
1638
  # blob
1644
1639
 
1645
- if @files.download_file_s3(f[0], relative_path, project_home, commit_sha1 = current_commit)
1640
+ if @files.download_file_s3(f[0], relative_path, project_home, commit_sha1=current_commit)
1646
1641
  f
1647
1642
  successful_changes << relative_path
1648
1643
  else
1649
- is_success = false
1644
+ is_success =false
1650
1645
  log_message("Could not download file: #{f[0]}", Thor::Shell::Color::RED)
1651
1646
  raise Parallel::Kill
1652
1647
 
1653
1648
  end
1654
1649
  end
1655
1650
  end
1651
+ successful_changes = response["result"]["tree"]
1652
+ if !successful_changes.nil? and is_success
1653
+ Project.verify_cnvrgignore_exist(project_name,remote)
1654
+ log_message("Done.\nDownloaded #{successful_changes.size}/#{response["result"]["tree"].size} files", Thor::Shell::Color::GREEN)
1655
+ else
1656
+ log_message("Couldn't download some files", Thor::Shell::Color::RED)
1657
+
1658
+ end
1656
1659
  rescue Interrupt
1657
- is_success = false
1658
1660
  log_message("Couldn't download, Rolling Back all changes.", Thor::Shell::Color::RED)
1659
1661
 
1660
- @files.revoke_download([], response["result"]["tree"])
1661
- exit(1)
1662
+ @files.revoke_clone(project_home)
1663
+ return
1664
+ end
1662
1665
  end
1663
1666
 
1664
1667
 
1665
1668
  end
1666
- successful_changes = response["result"]["tree"]
1667
- if !successful_changes.nil? and is_success
1668
- Project.verify_cnvrgignore_exist(project_name, remote)
1669
- log_message("Done.\nDownloaded #{successful_changes.size}/#{response["result"]["tree"].size} files", Thor::Shell::Color::GREEN)
1670
- else
1671
- log_message("Couldn't download some files", Thor::Shell::Color::RED)
1672
-
1673
- end
1674
1669
 
1675
1670
  else
1676
1671
 
1677
- log_message("Error: Couldn't create directory: #{project_name}", Thor::Shell::Color::RED)
1678
- exit(1)
1672
+ log_message("Error: Couldn't clone: #{project_name}", Thor::Shell::Color::RED)
1673
+ @files.revoke_clone(project_home)
1674
+
1675
+ return
1679
1676
  end
1680
1677
  rescue SignalException
1681
1678
  say "\nAborting"
1682
- exit(1)
1679
+ @files.revoke_clone(project_home)
1680
+
1681
+ return
1683
1682
  end
1684
1683
 
1685
1684
  end
@@ -2153,6 +2152,7 @@ module Cnvrg
2153
2152
  method_option :message, :type => :string, :aliases => ["-m", "--message"], :default => ""
2154
2153
  method_option :deploy, :type => :boolean, :aliases => ["-d", "--deploy"], :default => false
2155
2154
  method_option :return_id, :type => :boolean, :aliases => ["-r", "--return_id"], :default => false
2155
+ method_option :files, :type => :string, :aliases => ["-f", "--files"], :default => nil
2156
2156
 
2157
2157
  def upload(link = false, sync = false, direct = false, ignore_list = "", in_exp = false)
2158
2158
 
@@ -2169,6 +2169,10 @@ module Cnvrg
2169
2169
  @files = Cnvrg::Files.new(@project.owner, @project.slug)
2170
2170
  ignore = options[:ignore] || ""
2171
2171
  force = options[:force] || false
2172
+ spec_files_to_upload = options["files"]
2173
+ if !spec_files_to_upload.blank?
2174
+ spec_files_to_upload = spec_files_to_upload.split(",")
2175
+ end
2172
2176
 
2173
2177
  if ignore.nil? or ignore.empty?
2174
2178
  ignore = ignore_list
@@ -2186,7 +2190,7 @@ module Cnvrg
2186
2190
  end
2187
2191
  new_branch = options["new_branch"] || false
2188
2192
 
2189
- result = @project.compare_idx(new_branch, force: force, deploy: options["deploy"],in_exp:in_exp)
2193
+ result = @project.compare_idx(new_branch, force: force, deploy: options["deploy"],in_exp:in_exp, specific_files: spec_files_to_upload)
2190
2194
  commit = result["result"]["commit"]
2191
2195
  if !link
2192
2196
  if (result["result"]["new_version_exist"] and !force) or ((commit != @project.last_local_commit and !@project.last_local_commit.nil? and !result["result"]["tree"]["updated_on_server"].empty?) and !force)
@@ -2197,19 +2201,6 @@ module Cnvrg
2197
2201
  log_message("Comparing local changes with remote version:", Thor::Shell::Color::BLUE, (options["verbose"]))
2198
2202
  end
2199
2203
  result = result["result"]["tree"]
2200
- # if result["added"].any? {|x| x.include? ".conflict"} or !result["conflicts"].empty?
2201
- # all = result["added"].select {|x| x.include? ".conflict"} +result["conflicts"].flatten
2202
- # if all.size == 1
2203
- # num = "conflict"
2204
- # else
2205
- # num = "conflicts"
2206
- # end
2207
- # say "Project contains #{all.size} #{num}:", Thor::Shell::Color::RED
2208
- # say "#{all.join("\n")}"
2209
- # say "Please fix #{num}, and retry", Thor::Shell::Color::RED
2210
- # exit(1)
2211
- #
2212
- # end
2213
2204
  check = Helpers.checkmark()
2214
2205
  if result["added"].empty? and result["updated_on_local"].empty? and result["deleted"].empty?
2215
2206
  log_message("#{check} Project is up to date", Thor::Shell::Color::GREEN, (((options["sync"] or sync) and !direct) ? false : true))
@@ -2833,7 +2824,6 @@ module Cnvrg
2833
2824
  else
2834
2825
  # blob
2835
2826
  log_message("downloading file: #{f}", Thor::Shell::Color::BLUE, options["verbose"])
2836
-
2837
2827
  if @files.download_file_s3(f, relative_path, project_home)
2838
2828
  f
2839
2829
  else
@@ -3001,14 +2991,13 @@ module Cnvrg
3001
2991
  def show
3002
2992
  path = options['path']
3003
2993
  commit = options['commit']
2994
+ verify_logged_in(true)
2995
+ log_start(__method__, args, options)
2996
+ project_home = get_project_home
2997
+ @project = Project.new(project_home)
3004
2998
 
3005
- verify_logged_in(true)
3006
- log_start(__method__, args, options)
3007
- project_home = get_project_home
3008
- @project = Project.new(project_home)
3009
2999
 
3010
3000
 
3011
- project_dir = is_cnvrg_dir(Dir.pwd)
3012
3001
  @files = Cnvrg::Files.new(@project.owner, @project.slug)
3013
3002
  begin
3014
3003
 
@@ -3084,6 +3073,7 @@ module Cnvrg
3084
3073
  method_option :return_id, :type => :boolean, :aliases => ["-r", "--return_id"], :default => false
3085
3074
  method_option :deploy, :type => :boolean, :aliases => ["-d", "--deploy"], :default => false
3086
3075
  method_option :in_exp, :type => :boolean, :aliases => ["-e", "--in_exp"], :default => false
3076
+ method_option :files, :type => :string, :aliases => ["-f", "--files"], :default => nil
3087
3077
 
3088
3078
  def sync(direct = true)
3089
3079
  verify_logged_in(true) if direct
@@ -3094,7 +3084,7 @@ module Cnvrg
3094
3084
  invoke :download, [true, "", options["in_exp"] ], :new_branch => options["new_branch"], :verbose => options["verbose"], :sync => true
3095
3085
  end
3096
3086
  invoke :upload, [false, true, direct, "",options["in_exp"] ], :new_branch => options["new_branch"], :verbose => options["verbose"], :sync => true,
3097
- :ignore => options[:ignore], :force => options[:force], :message => options[:message], :deploy => options["deploy"], :return_id => options["return_id"]
3087
+ :ignore => options[:ignore], :force => options[:force], :message => options[:message], :deploy => options["deploy"], :return_id => options["return_id"], :files => options["files"]
3098
3088
 
3099
3089
 
3100
3090
  end
@@ -3105,9 +3095,9 @@ module Cnvrg
3105
3095
  method_option :small, :type => :boolean, :aliases => ["-sm", "--small"], :default => false
3106
3096
  method_option :medium, :type => :boolean, :aliases => ["-md", "--medium"], :default => false
3107
3097
  method_option :large, :type => :boolean, :aliases => ["-lg", "--large"], :default => false
3108
- method_option :gpu, :type => :boolean, :aliases => ["--gpu"], :default => false
3109
- method_option :gpuxl, :type => :boolean, :aliases => ["--gpuxl"], :default => false
3110
- method_option :gpuxxl, :type => :boolean, :aliases => ["--gpuxxl"], :default => false
3098
+ method_option :gpu_1, :type => :boolean, :aliases => ["--gpu"], :default => false
3099
+ method_option :gpu_2, :type => :boolean, :aliases => ["--gpuxl"], :default => false
3100
+ method_option :gpu_3, :type => :boolean, :aliases => ["--gpuxxl"], :default => false
3111
3101
  method_option :sync_before, :type => :boolean, :aliases => ["-sb", "--sync_before"], :default => true
3112
3102
  method_option :sync_after, :type => :boolean, :aliases => ["-sa", "--sync_after"], :default => true
3113
3103
  method_option :title, :type => :string, :aliases => ["-t", "--title"], :default => ""
@@ -3153,7 +3143,7 @@ module Cnvrg
3153
3143
  options_hash = Hash[options]
3154
3144
  real_options = []
3155
3145
  options_hash.each do |o|
3156
- real_options << o if (!o[1].eql? "" and !["small", "medium", "large", "gpu", "gpuxl", "gpuxxl"].include? o[0])
3146
+ real_options << o if (!o[1].eql? "" and !["small", "medium", "large", "gpu_1", "gpu_2", "gpu_3"].include? o[0])
3157
3147
  end
3158
3148
  if local
3159
3149
  invoke :exec, [cmd], :sync_before => sync_before, :sync_after => sync_after, :title => title,
@@ -3175,7 +3165,7 @@ module Cnvrg
3175
3165
  end
3176
3166
  real_options.delete(["local", false])
3177
3167
  instances = {"small" => options["small"], "medium" => options["medium"], "large" => options["large"],
3178
- "gpu" => options["gpu"], "gpuxl" => options["gpuxl"], "gpuxxl" => options["gpuxxl"]}
3168
+ "gpu_1" => options["gpu_2"], "gpu_3" => options["gpuxxl"]}
3179
3169
  instance_type = get_instance_type(instances)
3180
3170
  if !instance_type.nil? and !instance_type.empty?
3181
3171
  real_options << ["machine_type", instance_type]
@@ -3212,8 +3202,6 @@ module Cnvrg
3212
3202
  method_option :periodic_sync, :type => :string, :aliases => ["-ps", "--periodic_sync"], :default => ""
3213
3203
  def exec(*cmd)
3214
3204
  log = []
3215
- cpu_average = 0
3216
- memory_average = 0
3217
3205
  verify_logged_in(true)
3218
3206
  log_start(__method__, args, options)
3219
3207
  working_dir = is_cnvrg_dir
@@ -3340,6 +3328,24 @@ module Cnvrg
3340
3328
  end
3341
3329
  end
3342
3330
  # end
3331
+ stats_thread = Thread.new do
3332
+ loop do
3333
+ begin
3334
+ stats = remote ? usage_metrics_in_docker(docker_id) : Helpers.linux? ? {memory: memory_usage, cpu: cpu_usage} : {}
3335
+ if is_on_gpu
3336
+ gu = gpu_util
3337
+ stats['gpu'] = gu[0]
3338
+ stats['gpu_util'] = gu[1]
3339
+ end
3340
+ @exp.send_machine_stats [stats]
3341
+ rescue => e
3342
+ log_error(e)
3343
+ log_message("Failed to upload ongoing stats, continuing with experiment", Thor::Shell::Color::YELLOW)
3344
+ ensure
3345
+ sleep(30)
3346
+ end
3347
+ end
3348
+ end
3343
3349
 
3344
3350
 
3345
3351
  log_thread = Thread.new do
@@ -3349,30 +3355,7 @@ module Cnvrg
3349
3355
  begin
3350
3356
  if log_count != 0
3351
3357
  if time_to_upload <= Time.now - start_loop
3352
- if remote
3353
- stats = usage_metrics_in_docker(docker_id)
3354
- cpu = stats[0]
3355
- memory = stats[1]
3356
- if is_on_gpu
3357
- gpu_stats = gpu_util
3358
- gpu_utilization = gpu_stats[0]
3359
- gpu_memory_util = gpu_stats[1]
3360
- end
3361
- else
3362
- if Helpers.linux?
3363
- memory = memory_usage()
3364
- cpu = cpu_usage()
3365
- end
3366
-
3367
- end
3368
- log.each do |l|
3369
- if remote and is_on_gpu
3370
- l.merge!(cpu: cpu, memory: memory, gpu_util: gpu_utilization, gpu_memory_util: gpu_memory_util)
3371
- else
3372
- l.merge!(cpu: cpu, memory: memory)
3373
- end
3374
- end
3375
- @exp.upload_temp_log(log, cpu_average, memory_average)
3358
+ @exp.upload_temp_log(log)
3376
3359
  log = []
3377
3360
  start_loop = Time.now
3378
3361
  end
@@ -3416,12 +3399,9 @@ module Cnvrg
3416
3399
 
3417
3400
  rescue Errno::EIO => e
3418
3401
  log_error(e)
3419
-
3420
- # break
3421
3402
  rescue Errno::ENOENT => e
3422
3403
 
3423
3404
  exp_success = false
3424
-
3425
3405
  log_message("command \"#{cmd}\" couldn't be executed, verify command is valid", Thor::Shell::Color::RED)
3426
3406
  log_error(e)
3427
3407
  rescue Open4::ChildExited
@@ -3429,9 +3409,7 @@ module Cnvrg
3429
3409
  log_message("The process exited!", Thor::Shell::Color::RED)
3430
3410
  rescue => e
3431
3411
  sleep(20) # end cycle
3432
-
3433
3412
  res = @exp.end(log, 1, start_commit, cpu_average, memory_average)
3434
-
3435
3413
  log_message("Error occurred,aborting", Thor::Shell::Color::RED)
3436
3414
  log_error(e)
3437
3415
  exit(0)
@@ -3488,11 +3466,12 @@ module Cnvrg
3488
3466
  }
3489
3467
  log << cur_log
3490
3468
  sleep(20) # end cycle
3491
-
3492
3469
  res = @exp.end(log, "-1", end_commit, cpu_average, memory_average)
3493
3470
 
3494
3471
  end
3495
3472
  log_error(e)
3473
+ Thread.kill(log_thread)
3474
+ Thread.kill(stats_thread)
3496
3475
 
3497
3476
  exit(1)
3498
3477
  end
@@ -3664,36 +3643,6 @@ module Cnvrg
3664
3643
  res = exp.exec_remote(command, commit_to_run, instance_type, image_slug, schedule, local_timestamp, grid, path_to_cmd, data, data_commit,
3665
3644
  periodic_sync, sync_before_terminate, max_time, ds_sync_options)
3666
3645
  if Cnvrg::CLI.is_response_success(res)
3667
- # if res["result"]["machine"] == -1
3668
- # say "There are no available machines", Thor::Shell::Color::BLUE
3669
- # create = yes? "create new machine?", Thor::Shell::Color::YELLOW
3670
- # if create
3671
- # res = Cnvrg::API.request("users/#{image.owner}/machines/list", 'GET')
3672
- # if Cnvrg::CLI.is_response_success(res)
3673
- # instance_type = machine_options(res["result"]["aws_options"])
3674
- # if @image.new_machine(instance_type)
3675
- # say "Running remote experiment", Thor::Shell::Color::BLUE
3676
- #
3677
- # # res = image.exec_remote(exec_args, exec_options, project.last_local_commit)
3678
- # # if Cnvrg::CLI.is_response_success(res)
3679
- #
3680
- # check = Helpers.checkmark()
3681
- # say "#{check} Finished successfuly", Thor::Shell::Color::GREEN
3682
- # exit(0)
3683
- # # end
3684
- # end
3685
- # else
3686
- # say "No machines are avilable", Thor::Shell::Color::RED
3687
- # exit(0)
3688
- # end
3689
- #
3690
- #
3691
- # else
3692
- # say "Can't execute command on remote machine with local image", Thor::Shell::Color::RED
3693
- # exit(1)
3694
- #
3695
- # end
3696
- # else
3697
3646
  check = Helpers.checkmark()
3698
3647
  str = "#{check} Experiment's is on: #{Cnvrg::Helpers.remote_url}/#{project.owner}/projects/#{project.slug}/experiments/#{res["result"]["exp_url"]}"
3699
3648
 
@@ -3723,18 +3672,17 @@ module Cnvrg
3723
3672
  end
3724
3673
  end
3725
3674
  desc 'deploy', 'Deploys model to production'
3726
- method_option :small, :type => :boolean, :aliases => ["-sm", "--small"], :default => false
3727
- method_option :medium, :type => :boolean, :aliases => ["-md", "--medium"], :default => false
3728
- method_option :large, :type => :boolean, :aliases => ["-lg", "--large"], :default => false
3675
+ method_option :small, :type => :boolean, :aliases => ["-s", "--small"], :default => false
3676
+ method_option :medium, :type => :boolean, :aliases => ["-m", "--medium"], :default => false
3677
+ method_option :large, :type => :boolean, :aliases => ["-l", "--large"], :default => false
3729
3678
  method_option :gpu, :type => :boolean, :aliases => ["--gpu"], :default => false
3730
3679
  method_option :gpuxl, :type => :boolean, :aliases => ["--gpuxl"], :default => false
3731
3680
  method_option :gpuxxl, :type => :boolean, :aliases => ["--gpuxxl"], :default => false
3732
- method_option :schedule, :type => :string, :aliases => ["--schedule", "-s"], :default => ""
3733
-
3681
+ method_option :schedule, :type => :string, :aliases => ["--schedule"], :default => ""
3734
3682
  method_option :commit, :type => :string, :aliases => ["--commit", "-c"], :default => ""
3735
3683
  method_option :workers, :type => :string, :aliases => ["--workers", "-w"], :default => ""
3736
3684
  method_option :file_as_input, :type => :boolean, :aliases => ["--input", "-i"], :default => false
3737
-
3685
+ method_option :title, :type => :string, :aliases => ["--title", "-t"], :default => ""
3738
3686
  def deploy(file_to_run, function)
3739
3687
  verify_logged_in(true)
3740
3688
  log_start(__method__, args, options)
@@ -3744,16 +3692,14 @@ module Cnvrg
3744
3692
  "gpu" => options["gpu"], "gpuxl" => options["gpuxl"], "gpuxxl" => options["gpuxxl"]}
3745
3693
  instance_type = get_instance_type(instances)
3746
3694
 
3747
- schedule = options["schedule"] || ""
3748
-
3695
+ schedule = options["schedule"] || ""
3696
+ title = options['title']
3749
3697
 
3750
- if !schedule.nil? and !schedule.empty?
3751
-
3752
- local_timestamp = get_schedule_date
3753
-
3754
- end
3755
- project = Project.new(working_dir)
3756
- commit_to_run = options["commit"] || nil
3698
+ if !schedule.nil? and !schedule.empty?
3699
+ local_timestamp = get_schedule_date
3700
+ end
3701
+ project = Project.new(working_dir)
3702
+ commit_to_run = options["commit"] || nil
3757
3703
 
3758
3704
  workers = options["workers"] || nil
3759
3705
  begin
@@ -3767,14 +3713,8 @@ module Cnvrg
3767
3713
 
3768
3714
  image = is_project_with_docker(working_dir)
3769
3715
  if !image or !image.is_docker
3770
- # say "Couldn't find image related to project", Thor::Shell::Color::RED
3771
- # default = yes? "use cnvrg default image?", Thor::Shell::Color::YELLOW
3772
- # if default
3773
3716
  image = Images.new(working_dir, "cnvrg")
3774
3717
  image_slug = image.image_slug
3775
- # else
3776
- # exit(0)
3777
- # end
3778
3718
  else
3779
3719
  image_slug = image.image_slug
3780
3720
  end
@@ -3782,42 +3722,12 @@ module Cnvrg
3782
3722
 
3783
3723
  invoke :sync, [false], []
3784
3724
 
3785
- res = project.deploy(file_to_run, function, nil, commit_to_run, instance_type, image_slug, schedule, local_timestamp, num_workers, file_as_input)
3725
+ res = project.deploy(file_to_run, function, nil, commit_to_run, instance_type, image_slug, schedule, local_timestamp, num_workers, file_as_input, title)
3786
3726
 
3787
3727
  if Cnvrg::CLI.is_response_success(res)
3788
3728
 
3789
- # if res["result"]["machine"] == -1
3790
- # say "There are no available machines", Thor::Shell::Color::BLUE
3791
- # create = yes? "create new machine?", Thor::Shell::Color::YELLOW
3792
- # if create
3793
- # res = Cnvrg::API.request("users/#{image.owner}/machines/list", 'GET')
3794
- # if Cnvrg::CLI.is_response_success(res)
3795
- # instance_type = machine_options(res["result"]["aws_options"])
3796
- # if @image.new_machine(instance_type)
3797
- # say "Running remote experiment", Thor::Shell::Color::BLUE
3798
- #
3799
- # # res = image.exec_remote(exec_args, exec_options, project.last_local_commit)
3800
- # # if Cnvrg::CLI.is_response_success(res)
3801
- #
3802
- # check = Helpers.checkmark()
3803
- # say "#{check} Finished successfuly", Thor::Shell::Color::GREEN
3804
- # exit(0)
3805
- # # end
3806
- # end
3807
- # else
3808
- # say "No machines are avilable", Thor::Shell::Color::RED
3809
- # exit(0)
3810
- # end
3811
- #
3812
- #
3813
- # else
3814
- # say "Can't execute command on remote machine with local image", Thor::Shell::Color::RED
3815
- # exit(1)
3816
- #
3817
- # end
3818
- # else
3819
- check = Helpers.checkmark()
3820
- log_message("#{check} Deployment process is on: #{Cnvrg::Helpers.remote_url}/#{project.owner}/projects/#{project.slug}/deploys/show/#{res["result"]["deploy_slug"]}", Thor::Shell::Color::GREEN)
3729
+ check = Helpers.checkmark()
3730
+ log_message("#{check} Deployment process is on: #{Cnvrg::Helpers.remote_url}/#{project.owner}/projects/#{project.slug}/endpoints/show/#{res["result"]["deploy_slug"]}", Thor::Shell::Color::GREEN)
3821
3731
 
3822
3732
  exit(0)
3823
3733
  # end
@@ -6057,31 +5967,6 @@ module Cnvrg
6057
5967
  history = container.exec(command, tty: true)[0]
6058
5968
  diff = [pip, dpkg, history]
6059
5969
  return diff
6060
- # File.open(dir+"/.cnvrg/pip_#{date}.txt", "w+") { |f| f.write pip }
6061
- # File.open(dir+"/.cnvrg/dpkg_#{date}.txt", "w+") { |f| f.write dpkg }
6062
- # File.open(dir+"/.cnvrg/history_#{date}.txt", "w+") { |f| f.write history }
6063
- #
6064
- # pip_new = pip[0].split("\r\n")
6065
- # pip_base_file =JSON.parse(File.open( dir+"/.cnvrg/pip_base.txt","rb").read)
6066
- # pip_base = pip_base_file[0].split("\r\n")
6067
- #
6068
- # pip_diff = pip_new - pip_base
6069
- # if pip_diff.empty?
6070
- # puts "pip is same"
6071
- # else
6072
- # puts pip_diff
6073
- # end
6074
- # dpkg_new = dpkg[0].split("\r\n")
6075
- # dpkg_base_file =JSON.parse(File.open( dir+"/.cnvrg/dpkg_base.txt","rb").read)
6076
- # dpkg_base = dpkg_base_file[0].split("\r\n")
6077
- #
6078
- # dpkg_diff = dpkg_new - dpkg_base
6079
- # if dpkg_diff.empty?
6080
- # puts "dpkg is same"
6081
- # else
6082
- # puts dpkg_diff
6083
- # end
6084
- # puts history
6085
5970
  end
6086
5971
 
6087
5972
  def is_port_taken(ip = Cnvrg::CLI::IP, port = Cnvrg::CLI::PORT, seconds = 1)
@@ -6098,7 +5983,7 @@ module Cnvrg
6098
5983
  end
6099
5984
 
6100
5985
  def image_activity(image)
6101
- res = image.handle_image_activity()
5986
+ res = image.handle_image_activity
6102
5987
  if res == -1
6103
5988
  #image is not known
6104
5989
  say "Images #{image.image_name} is not known", Thor::Shell::Color::YELLOW
@@ -6132,6 +6017,29 @@ module Cnvrg
6132
6017
 
6133
6018
  end
6134
6019
 
6020
+
6021
+
6022
+ def format_schedule(schedule)
6023
+ if schedule.start_with? 'in'
6024
+ time = schedule.split(" ")
6025
+
6026
+ local = Time.now.localtime
6027
+ if time[2].downcase().start_with? "min"
6028
+ new = local + (time[1].to_i * 60)
6029
+ elsif time[2].downcase().start_with? "hours"
6030
+ new = local + (time[1].to_i * 3600)
6031
+ elsif time[2].downcase().start_with? "days"
6032
+ new = local + (time[1].to_i * 3600 * 24)
6033
+ else
6034
+ log_message("Could not undersatnd when to schedule experiment", Thor::Shell::Color::RED)
6035
+ exit(1)
6036
+ end
6037
+ new_time = new.to_s
6038
+ new_time = new_time[0, new_time.size-6] #remove timezone
6039
+ schedule = "at #{new_time}"
6040
+ end
6041
+ schedule
6042
+ end
6135
6043
  def update_deleted(deleted)
6136
6044
  final = []
6137
6045
  deleted.each do |d|
@@ -6139,7 +6047,7 @@ module Cnvrg
6139
6047
  to_add = true
6140
6048
  value = all_subs[0]
6141
6049
  all_subs.each_with_index do |a, i|
6142
- if final.include? value + "/"
6050
+ if final.include? value+"/"
6143
6051
  to_add = false
6144
6052
  break
6145
6053
  end
@@ -6147,7 +6055,6 @@ module Cnvrg
6147
6055
  end
6148
6056
  final << d if to_add
6149
6057
 
6150
-
6151
6058
  end
6152
6059
 
6153
6060
 
@@ -6258,7 +6165,7 @@ module Cnvrg
6258
6165
  end
6259
6166
 
6260
6167
  def usage_metrics_in_docker(docker_id)
6261
- res = [0.0, 0.0]
6168
+ res = {cpu: 0.0, memory: 0.0}
6262
6169
  begin
6263
6170
  if docker_id.nil?
6264
6171
  docker_id = `cat /etc/hostname`
@@ -6268,7 +6175,7 @@ module Cnvrg
6268
6175
  conv = stats.split(",")
6269
6176
  cpu = conv[0].gsub!("%", "").to_f
6270
6177
  memory = conv[1].gsub!("%", "").to_f
6271
- res = [cpu, memory]
6178
+ res = {cpu: cpu, memory: memory}
6272
6179
  return res
6273
6180
  end
6274
6181
  rescue
@@ -103,12 +103,17 @@ module Cnvrg
103
103
  return response
104
104
  end
105
105
 
106
- def upload_temp_log(temp_log, cpu_average, memory_average)
106
+ def upload_temp_log(temp_log)
107
107
  response = Cnvrg::API.request(@base_resource + "experiment/upload_temp_log", 'POST', {output: temp_log,
108
108
  exp_slug: @slug})
109
109
  Cnvrg::CLI.is_response_success(response,false)
110
110
  end
111
111
 
112
+ def send_machine_stats(stats)
113
+ response = Cnvrg::API.request(@base_resource + "experiment/upload_stats", "POST", {exp_slug: @slug, stats: stats.map{|s| s.merge!({time: Time.now})}})
114
+ Cnvrg::CLI.is_response_success(response,false)
115
+ end
116
+
112
117
  def end(output, exit_status, end_commit, cpu_average, memory_average)
113
118
  #if remote try to remove
114
119
  response = Cnvrg::API.request(@base_resource + "experiment/end", 'POST', {output: output, exp_slug: @slug,
@@ -3,6 +3,7 @@ require 'aws-sdk'
3
3
  require 'URLcrypt'
4
4
  require 'tempfile'
5
5
  require 'net/http'
6
+ require 'cnvrg/result'
6
7
  module Cnvrg
7
8
  class Files
8
9
 
@@ -373,6 +374,7 @@ module Cnvrg
373
374
  return Cnvrg::CLI.is_response_success(response, false)
374
375
  end
375
376
 
377
+
376
378
  def download_file_s3(absolute_path, relative_path, project_home, commit_sha1=nil, conflict=false)
377
379
  begin
378
380
  res = Cnvrg::API.request(@base_resource + "download_file", 'POST', {absolute_path: absolute_path, relative_path: relative_path,
@@ -402,6 +404,7 @@ module Cnvrg
402
404
  end
403
405
  end
404
406
  if !success
407
+ puts "error in sts"
405
408
  return false
406
409
  end
407
410
 
@@ -445,11 +448,127 @@ module Cnvrg
445
448
  end
446
449
 
447
450
  rescue => e
448
- puts e.message
451
+ puts "error in aws"
452
+
453
+ puts e.message
449
454
  return false
450
455
 
451
456
  end
452
457
  end
458
+ def download_multiple_files_s3(files, project_home)
459
+ begin
460
+
461
+ sts_path = files["path_sts"]
462
+ retries = 0
463
+ success= false
464
+ while !success and retries < 20
465
+ begin
466
+ if !Helpers.is_verify_ssl
467
+ body = open(sts_path, {ssl_verify_mode: OpenSSL::SSL::VERIFY_NONE}).read
468
+ else
469
+ body = open(sts_path).read
470
+ end
471
+ success = true
472
+ rescue => e
473
+ retries +=1
474
+ sleep(5)
475
+
476
+ end
477
+ end
478
+ if !success
479
+ return Cnvrg::Result.new(false,"couldn't download some files", "error in sts", "" )
480
+ end
481
+ split = body.split("\n")
482
+ key = split[0]
483
+ iv = split[1]
484
+
485
+ access = Cnvrg::Helpers.decrypt(key, iv, files["sts_a"])
486
+
487
+ secret = Cnvrg::Helpers.decrypt(key,iv, files["sts_s"])
488
+
489
+ session = Cnvrg::Helpers.decrypt(key,iv, files["sts_st"])
490
+ region = Cnvrg::Helpers.decrypt(key,iv, files["region"])
491
+
492
+ bucket = Cnvrg::Helpers.decrypt(key,iv, files["bucket"])
493
+ is_s3 = files["is_s3"]
494
+ if is_s3 or is_s3.nil?
495
+ client = Aws::S3::Client.new(
496
+ :access_key_id =>access,
497
+ :secret_access_key => secret,
498
+ :session_token => session,
499
+ :region => region,
500
+ :http_open_timeout => 60, :retry_limit => 20)
501
+ else
502
+ endpoint = Cnvrg::Helpers.decrypt(key,iv, files["endpoint_url"])
503
+ client = Aws::S3::Client.new(
504
+ :access_key_id =>access,
505
+ :secret_access_key => secret,
506
+ :region => region,
507
+ :endpoint=> endpoint,:force_path_style=> true,:ssl_verify_peer=>false,
508
+ :http_open_timeout => 60, :retry_limit => 20)
509
+ end
510
+ download_succ_count = 0
511
+ parallel_options = {
512
+ :progress => {
513
+ :title => "Download Progress",
514
+ :progress_mark => '=',
515
+ :format => "%b>>%i| %p%% %t",
516
+ :starting_at => 0,
517
+ :total => files["keys"].size,
518
+ :autofinish => true
519
+ },
520
+ in_threads: Cnvrg::Helpers.parallel_threads,
521
+ isolation: true
522
+ }
523
+ Parallel.map(files["keys"], parallel_options) do |f|
524
+
525
+ file_path = f["name"]
526
+ if file_path.end_with? "/"
527
+ # dir
528
+ if download_dir(file_path, file_path, project_home)
529
+ download_succ_count += 1
530
+ else
531
+ return Cnvrg::Result.new(false,"Could not create directory: #{file_path}")
532
+ raise Parallel::Kill
533
+ end
534
+ else
535
+ # blob
536
+ begin
537
+ file_key = Cnvrg::Helpers.decrypt(key,iv, f["path"])
538
+ resp = false
539
+ File.open(project_home+"/"+file_path, 'w+') do |file|
540
+ resp = client.get_object({bucket:bucket,
541
+ key:file_key}, target: file)
542
+ end
543
+ if resp
544
+ download_succ_count +=1
545
+ else
546
+ return Cnvrg::Result(false,"Could not create file: #{file_path}")
547
+ end
548
+
549
+
550
+
551
+ rescue => e
552
+ return Cnvrg::Result.new(false,"Could not create file: #{file_path}", e.message, e.backtrace)
553
+ raise Parallel::Kill
554
+ end
555
+
556
+
557
+
558
+ end
559
+ end
560
+ if download_succ_count == files["keys"].size
561
+ return Cnvrg::Result.new(true,"Done.\nDownloaded #{download_succ_count} files")
562
+ end
563
+ rescue => e
564
+
565
+ return Cnvrg::Result.new(false,"Could not download some files", e.message, e.backtrace)
566
+ end
567
+
568
+
569
+
570
+
571
+ end
453
572
 
454
573
  def download_file(absolute_path, relative_path, project_home, conflict=false)
455
574
  res = Cnvrg::API.request(@base_resource + "download_file", 'POST', {absolute_path: absolute_path, relative_path: relative_path})
@@ -560,6 +679,13 @@ module Cnvrg
560
679
  return true
561
680
 
562
681
  end
682
+ def revoke_clone(project_home)
683
+ begin
684
+ FileUtils.rm_rf(project_home)
685
+ rescue
686
+ end
687
+
688
+ end
563
689
  def delete_commit_files_local(deleted)
564
690
  begin
565
691
  FileUtils.rm_rf(deleted) unless (deleted.nil? or deleted.empty?)
@@ -2,7 +2,10 @@ module Cnvrg
2
2
  module Helpers
3
3
 
4
4
  extend self
5
-
5
+ ParallelThreads ||= 10
6
+ def parallel_threads()
7
+ return ParallelThreads
8
+ end
6
9
  def checkmark
7
10
  checkmark = "\u2713"
8
11
  return checkmark.encode('utf-8')
@@ -356,16 +356,18 @@ module Cnvrg
356
356
  return response
357
357
  end
358
358
 
359
- def compare_idx(new_branch, commit:last_local_commit,force:false, deploy: false, in_exp:false)
359
+ def compare_idx(new_branch, commit:last_local_commit,force:false, deploy: false, in_exp:false, specific_files: [])
360
360
  if commit.nil?
361
361
  local_idx = YAML.load_file("#{self.local_path}/.cnvrg/idx.yml")
362
362
  else
363
363
  local_idx = self.generate_idx(deploy: deploy)
364
364
  end
365
365
  ignore_list = self.send_ignore_list()
366
- if force
366
+ if force or !specific_files.blank?
367
367
  added = []
368
- if local_idx[:tree]
368
+ if !specific_files.blank?
369
+ added = specific_files
370
+ elsif local_idx[:tree]
369
371
  added << local_idx[:tree].keys
370
372
  added.flatten!
371
373
  end
@@ -413,14 +415,15 @@ module Cnvrg
413
415
  return true
414
416
  end
415
417
 
416
- def deploy(file_to_run, function, input_params, commit_to_run, instance_type, image_slug, scheduling_query, local_timestamp,workers, file_input)
418
+ def deploy(file_to_run, function, input_params, commit_to_run, instance_type, image_slug, scheduling_query, local_timestamp,workers, file_input, title)
417
419
  response = Cnvrg::API.request("users/#{@owner}/projects/#{@slug}/deploy", 'POST', {file_to_run: file_to_run, function: function,
418
420
  image_slug: image_slug, input_params: input_params,
419
421
  commit_sha1: commit_to_run,
420
422
  instance_type: instance_type,
421
423
  scheduling_query: scheduling_query,
422
424
  local_timestamp: local_timestamp,
423
- workers:workers,file_input:file_input})
425
+ workers:workers,file_input:file_input,
426
+ title: title})
424
427
  return response
425
428
  end
426
429
  def list_commits
@@ -0,0 +1,29 @@
1
+ require 'fileutils'
2
+ module Cnvrg
3
+ class Result
4
+ attr_reader :msg, :msg_color, :e_msg, :e_msg_backtrace
5
+
6
+ def initialize(success, msg, e_msg = "", e_backtrace = "")
7
+ begin
8
+ @success = success
9
+ @msg = msg
10
+ @e_msg = e_msg
11
+ @e_msg_backtrace = e_backtrace
12
+ if !@success
13
+ @msg_color = Thor::Shell::Color::RED
14
+ else
15
+ @msg_color = Thor::Shell::Color::GREEN
16
+
17
+ end
18
+ rescue => e
19
+ end
20
+
21
+ end
22
+ def is_success?
23
+ return @success
24
+ end
25
+
26
+ end
27
+
28
+
29
+ end
@@ -1,4 +1,4 @@
1
1
  module Cnvrg
2
- VERSION = '0.4.0'
2
+ VERSION = '0.4.1.4'
3
3
  end
4
4
 
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: 0.4.0
4
+ version: 0.4.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yochay Ettun
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2018-05-02 00:00:00.000000000 Z
12
+ date: 2018-05-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -422,6 +422,7 @@ files:
422
422
  - lib/cnvrg/helpers.rb
423
423
  - lib/cnvrg/job.rb
424
424
  - lib/cnvrg/project.rb
425
+ - lib/cnvrg/result.rb
425
426
  - lib/cnvrg/runner.rb
426
427
  - lib/cnvrg/ssh.rb
427
428
  - lib/cnvrg/version.rb