theislab / scCODA

A Bayesian model for compositional single-cell data analysis
BSD 3-Clause "New" or "Revised" License
147 stars 24 forks source link

Which tensorflow version to use? #58

Closed c-westhoven closed 1 year ago

c-westhoven commented 2 years ago

Hi sccoda team,

While trying to also run sccoda on my laptop (MacBook Air M1), and downloading all relevant packages for my project, I've come across a version discrepancy. (Note: when I installed sccoda/tensorflow on an iMac a few weeks back the issue did not arise)

When installing tensorflow: sccoda 0.1.7 requires numpy>=1.21, but you have numpy 1.19.5 which is incompatible. sccoda 0.1.7 requires tensorflow>=2.8, but you have tensorflow 2.5.0 which is incompatible. sccoda 0.1.7 requires tensorflow-probability>=0.16.0, but you have tensorflow-probability 0.12.0 which is incompatible.

On the description for sccoda installation however, other package versions are described.

This package uses the tensorflow (>=2.4, <2.6) and tensorflow-probability (==0.12) packages.

Which package versions ones should I be using?

Also, I've been having issues importing sccoda into my jupyter notebook, as the kernel stops running. Could that issue be related to the package versions? (Note: I do not have this issue using sccoda in jupyter notebook on an iMac, only on my macbook air)

Thanks!

johannesostner commented 2 years ago

Hi @c-westhoven,

when we updated scCODA recently to support the latest tensorflow (>=2.8) and tensorflow-probability (>=0.16) versions, we missed updating the readme. The correct version requirements should be displayed there now.

Regarding your issues with the macbook: If this isn't solved with upgrading to a later tensorflow version, I suspect that this is related to the fact that your macbook uses a M1 CPU, which might need a special installment of tensorflow to work (see here for example). Since I don't have access to such a CPU right now, I'm unfortunately not able to test this.

It would be great if you could report back on your experiences with running scCODA on your macbook! Thanks!

dawe commented 1 year ago

Hello there, following up on this as I am facing a similar issue. I've installed tf>2.8 (2.12.0) and tf-probability > 0.16 (0.19.0) and I cannot reproduce the "getting started" tutorial. In particular:

>>> model_salm = mod.CompositionalAnalysis(data_salm, formula="Condition", reference_cell_type="Goblet")

Metal device set to: Apple M2

systemMemory: 16.00 GB
maxCacheSize: 5.33 GB

>>> sim_results = model_salm.sample_hmc()
WARNING:tensorflow:From /Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/tensorflow_probability/python/internal/batched_rejection_sampler.py:102: calling while_loop_v2 (from tensorflow.python.ops.control_flow_ops) with back_prop=False is deprecated and will be removed in a future version.
Instructions for updating:
back_prop=False is deprecated. Consider using tf.stop_gradient instead.
Instead of:
results = tf.while_loop(c, b, vars, back_prop=False)
Use:
results = tf.nest.map_structure(tf.stop_gradient, tf.while_loop(c, b, vars))
2023-04-20 16:50:54.493289: W tensorflow/tsl/platform/profile_utils/cpu_utils.cc:128] Failed to get CPU frequency: 0 Hz
2023-04-20 16:50:54.864903: W tensorflow/core/framework/op_kernel.cc:1830] OP_REQUIRES failed at xla_ops.cc:362 : NOT_FOUND: could not find registered platform with id: 0x13ca32970
  0%|                                                 | 0/20000 [00:00<?, ?it/s]---------------------------------------------------------------------------
NotFoundError                             Traceback (most recent call last)
Cell In[31], line 1
----> 1 sim_results = model_salm.sample_hmc()

File ~/miniforge3/envs/sccoda/lib/python3.10/site-packages/scCODA-0.1.9-py3.10.egg/sccoda/model/scCODA_model.py:314, in CompositionalModel.sample_hmc(self, num_results, num_burnin, num_adapt_steps, num_leapfrog_steps, step_size, verbose)
    306         return {
    307             'target_log_prob': pkr.inner_results.inner_results.accepted_results.target_log_prob,
    308             'diverging': (pkr.inner_results.inner_results.log_accept_ratio < -1000.),
    309             'is_accepted': pkr.inner_results.inner_results.is_accepted,
    310             'step_size': pkr.inner_results.inner_results.accepted_results.step_size,
    311         }
    313 # The actual HMC sampling process
--> 314 states, kernel_results, duration = self.sampling(num_results, num_burnin,
    315                                                  hmc_kernel, self.init_params, trace_fn)
    317 if verbose:
    318     pbar.bar.close()

File ~/miniforge3/envs/sccoda/lib/python3.10/site-packages/scCODA-0.1.9-py3.10.egg/sccoda/model/scCODA_model.py:165, in CompositionalModel.sampling(self, num_results, num_burnin, kernel, init_state, trace_fn)
    163 # The actual sampling process
    164 start = time.time()
--> 165 states, kernel_results = sample_mcmc(num_results, num_burnin, kernel, init_state, trace_fn)
    166 duration = time.time() - start
    167 print("MCMC sampling finished. ({:.3f} sec)".format(duration))

File ~/miniforge3/envs/sccoda/lib/python3.10/site-packages/tensorflow/python/util/traceback_utils.py:153, in filter_traceback.<locals>.error_handler(*args, **kwargs)
    151 except Exception as e:
    152   filtered_tb = _process_traceback_frames(e.__traceback__)
--> 153   raise e.with_traceback(filtered_tb) from None
    154 finally:
    155   del filtered_tb

File ~/miniforge3/envs/sccoda/lib/python3.10/site-packages/tensorflow/python/eager/execute.py:52, in quick_execute(op_name, num_outputs, inputs, attrs, ctx, name)
     50 try:
     51   ctx.ensure_initialized()
---> 52   tensors = pywrap_tfe.TFE_Py_Execute(ctx._handle, device_name, op_name,
     53                                       inputs, attrs, num_outputs)
     54 except core._NotOkStatusException as e:
     55   if name is not None:

NotFoundError: Graph execution error:

Detected at node 'mcmc_sample_chain/reduced_kernel_bootstrap_results/simple_step_size_adaptation___init__/_bootstrap_results/transformed_kernel_bootstrap_results/mh_bootstrap_results/hmc_kernel_bootstrap_results/maybe_call_fn_and_grads/value_and_gradients/value_and_gradient/PartitionedCall' defined at (most recent call last):
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/bin/ipython", line 8, in <module>
      sys.exit(start_ipython())
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/IPython/__init__.py", line 128, in start_ipython
      return launch_new_instance(argv=argv, **kwargs)
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/traitlets/config/application.py", line 1043, in launch_instance
      app.start()
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/IPython/terminal/ipapp.py", line 318, in start
      self.shell.mainloop()
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/IPython/terminal/interactiveshell.py", line 888, in mainloop
      self.interact()
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/IPython/terminal/interactiveshell.py", line 881, in interact
      self.run_cell(code, store_history=True)
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/IPython/core/interactiveshell.py", line 3006, in run_cell
      result = self._run_cell(
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/IPython/core/interactiveshell.py", line 3061, in _run_cell
      result = runner(coro)
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/IPython/core/async_helpers.py", line 129, in _pseudo_sync_runner
      coro.send(None)
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/IPython/core/interactiveshell.py", line 3266, in run_cell_async
      has_raised = await self.run_ast_nodes(code_ast.body, cell_name,
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/IPython/core/interactiveshell.py", line 3445, in run_ast_nodes
      if await self.run_code(code, result, async_=asy):
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/IPython/core/interactiveshell.py", line 3505, in run_code
      exec(code_obj, self.user_global_ns, self.user_ns)
    File "<ipython-input-31-719266c03b83>", line 1, in <module>
      sim_results = model_salm.sample_hmc()
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/scCODA-0.1.9-py3.10.egg/sccoda/model/scCODA_model.py", line 314, in sample_hmc
      states, kernel_results, duration = self.sampling(num_results, num_burnin,
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/scCODA-0.1.9-py3.10.egg/sccoda/model/scCODA_model.py", line 165, in sampling
      states, kernel_results = sample_mcmc(num_results, num_burnin, kernel, init_state, trace_fn)
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/scCODA-0.1.9-py3.10.egg/sccoda/model/scCODA_model.py", line 155, in sample_mcmc
      return tfp.mcmc.sample_chain(
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/tensorflow_probability/python/mcmc/sample.py", line 330, in sample_chain
      previous_kernel_results = kernel.bootstrap_results(current_state)
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/tensorflow_probability/python/experimental/mcmc/with_reductions.py", line 146, in bootstrap_results
      inner_results = self.inner_kernel.bootstrap_results(init_state)
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/tensorflow_probability/python/mcmc/simple_step_size_adaptation.py", line 443, in bootstrap_results
      inner_results = self.inner_kernel.bootstrap_results(init_state)
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/tensorflow_probability/python/mcmc/transformed_kernel.py", line 492, in bootstrap_results
      inner_results=self._inner_kernel.bootstrap_results(
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/tensorflow_probability/python/mcmc/hmc.py", line 561, in bootstrap_results
      kernel_results = self._impl.bootstrap_results(init_state)
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/tensorflow_probability/python/mcmc/metropolis_hastings.py", line 273, in bootstrap_results
      pkr = self.inner_kernel.bootstrap_results(init_state)
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/tensorflow_probability/python/mcmc/hmc.py", line 775, in bootstrap_results
      ] = mcmc_util.maybe_call_fn_and_grads(self.target_log_prob_fn, init_state)
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/tensorflow_probability/python/mcmc/internal/util.py", line 297, in maybe_call_fn_and_grads
      result, grads = _value_and_gradients(fn, fn_arg_list, result, grads)
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/tensorflow_probability/python/mcmc/internal/util.py", line 265, in _value_and_gradients
      return tfp_math_value_and_gradients(fn, fn_arg_list)
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/tensorflow_probability/python/math/gradient.py", line 108, in value_and_gradient
      return _value_and_grad_impl(
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/tensorflow_probability/python/math/gradient.py", line 378, in _value_and_grad_impl
      y, dydx, aux = grad_fn(lambda: f(*args, **kwargs) if _has_args(f) else f(),
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/tensorflow_probability/python/math/gradient.py", line 330, in _gradient_old
      y, aux = f()
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/tensorflow_probability/python/math/gradient.py", line 378, in <lambda>
      y, dydx, aux = grad_fn(lambda: f(*args, **kwargs) if _has_args(f) else f(),
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/tensorflow_probability/python/math/gradient.py", line 375, in <lambda>
      f = lambda *args, **kwargs: (real_f(*args, **kwargs)  # pylint: disable=g-long-lambda
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/tensorflow_probability/python/mcmc/transformed_kernel.py", line 123, in transformed_log_prob_fn
      tlp = log_prob_fn(*fn(state_parts))
Node: 'mcmc_sample_chain/reduced_kernel_bootstrap_results/simple_step_size_adaptation___init__/_bootstrap_results/transformed_kernel_bootstrap_results/mh_bootstrap_results/hmc_kernel_bootstrap_results/maybe_call_fn_and_grads/value_and_gradients/value_and_gradient/PartitionedCall'
Detected at node 'mcmc_sample_chain/reduced_kernel_bootstrap_results/simple_step_size_adaptation___init__/_bootstrap_results/transformed_kernel_bootstrap_results/mh_bootstrap_results/hmc_kernel_bootstrap_results/maybe_call_fn_and_grads/value_and_gradients/value_and_gradient/PartitionedCall' defined at (most recent call last):
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/bin/ipython", line 8, in <module>
      sys.exit(start_ipython())
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/IPython/__init__.py", line 128, in start_ipython
      return launch_new_instance(argv=argv, **kwargs)
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/traitlets/config/application.py", line 1043, in launch_instance
      app.start()
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/IPython/terminal/ipapp.py", line 318, in start
      self.shell.mainloop()
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/IPython/terminal/interactiveshell.py", line 888, in mainloop
      self.interact()
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/IPython/terminal/interactiveshell.py", line 881, in interact
      self.run_cell(code, store_history=True)
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/IPython/core/interactiveshell.py", line 3006, in run_cell
      result = self._run_cell(
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/IPython/core/interactiveshell.py", line 3061, in _run_cell
      result = runner(coro)
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/IPython/core/async_helpers.py", line 129, in _pseudo_sync_runner
      coro.send(None)
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/IPython/core/interactiveshell.py", line 3266, in run_cell_async
      has_raised = await self.run_ast_nodes(code_ast.body, cell_name,
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/IPython/core/interactiveshell.py", line 3445, in run_ast_nodes
      if await self.run_code(code, result, async_=asy):
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/IPython/core/interactiveshell.py", line 3505, in run_code
      exec(code_obj, self.user_global_ns, self.user_ns)
    File "<ipython-input-31-719266c03b83>", line 1, in <module>
      sim_results = model_salm.sample_hmc()
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/scCODA-0.1.9-py3.10.egg/sccoda/model/scCODA_model.py", line 314, in sample_hmc
      states, kernel_results, duration = self.sampling(num_results, num_burnin,
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/scCODA-0.1.9-py3.10.egg/sccoda/model/scCODA_model.py", line 165, in sampling
      states, kernel_results = sample_mcmc(num_results, num_burnin, kernel, init_state, trace_fn)
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/scCODA-0.1.9-py3.10.egg/sccoda/model/scCODA_model.py", line 155, in sample_mcmc
      return tfp.mcmc.sample_chain(
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/tensorflow_probability/python/mcmc/sample.py", line 330, in sample_chain
      previous_kernel_results = kernel.bootstrap_results(current_state)
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/tensorflow_probability/python/experimental/mcmc/with_reductions.py", line 146, in bootstrap_results
      inner_results = self.inner_kernel.bootstrap_results(init_state)
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/tensorflow_probability/python/mcmc/simple_step_size_adaptation.py", line 443, in bootstrap_results
      inner_results = self.inner_kernel.bootstrap_results(init_state)
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/tensorflow_probability/python/mcmc/transformed_kernel.py", line 492, in bootstrap_results
      inner_results=self._inner_kernel.bootstrap_results(
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/tensorflow_probability/python/mcmc/hmc.py", line 561, in bootstrap_results
      kernel_results = self._impl.bootstrap_results(init_state)
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/tensorflow_probability/python/mcmc/metropolis_hastings.py", line 273, in bootstrap_results
      pkr = self.inner_kernel.bootstrap_results(init_state)
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/tensorflow_probability/python/mcmc/hmc.py", line 775, in bootstrap_results
      ] = mcmc_util.maybe_call_fn_and_grads(self.target_log_prob_fn, init_state)
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/tensorflow_probability/python/mcmc/internal/util.py", line 297, in maybe_call_fn_and_grads
      result, grads = _value_and_gradients(fn, fn_arg_list, result, grads)
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/tensorflow_probability/python/mcmc/internal/util.py", line 265, in _value_and_gradients
      return tfp_math_value_and_gradients(fn, fn_arg_list)
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/tensorflow_probability/python/math/gradient.py", line 108, in value_and_gradient
      return _value_and_grad_impl(
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/tensorflow_probability/python/math/gradient.py", line 378, in _value_and_grad_impl
      y, dydx, aux = grad_fn(lambda: f(*args, **kwargs) if _has_args(f) else f(),
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/tensorflow_probability/python/math/gradient.py", line 330, in _gradient_old
      y, aux = f()
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/tensorflow_probability/python/math/gradient.py", line 378, in <lambda>
      y, dydx, aux = grad_fn(lambda: f(*args, **kwargs) if _has_args(f) else f(),
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/tensorflow_probability/python/math/gradient.py", line 375, in <lambda>
      f = lambda *args, **kwargs: (real_f(*args, **kwargs)  # pylint: disable=g-long-lambda
    File "/Users/cittaro.davide/miniforge3/envs/sccoda/lib/python3.10/site-packages/tensorflow_probability/python/mcmc/transformed_kernel.py", line 123, in transformed_log_prob_fn
      tlp = log_prob_fn(*fn(state_parts))
Node: 'mcmc_sample_chain/reduced_kernel_bootstrap_results/simple_step_size_adaptation___init__/_bootstrap_results/transformed_kernel_bootstrap_results/mh_bootstrap_results/hmc_kernel_bootstrap_results/maybe_call_fn_and_grads/value_and_gradients/value_and_gradient/PartitionedCall'
2 root error(s) found.
  (0) NOT_FOUND:  could not find registered platform with id: 0x13ca32970
     [[{{node mcmc_sample_chain/reduced_kernel_bootstrap_results/simple_step_size_adaptation___init__/_bootstrap_results/transformed_kernel_bootstrap_results/mh_bootstrap_results/hmc_kernel_bootstrap_results/maybe_call_fn_and_grads/value_and_gradients/value_and_gradient/PartitionedCall}}]]
     [[mcmc_sample_chain/trace_scan/while/exit/_277/_64]]
  (1) NOT_FOUND:  could not find registered platform with id: 0x13ca32970
     [[{{node mcmc_sample_chain/reduced_kernel_bootstrap_results/simple_step_size_adaptation___init__/_bootstrap_results/transformed_kernel_bootstrap_results/mh_bootstrap_results/hmc_kernel_bootstrap_results/maybe_call_fn_and_grads/value_and_gradients/value_and_gradient/PartitionedCall}}]]
0 successful operations.
0 derived errors ignored. [Op:__inference_sample_mcmc_3547]
johannesostner commented 1 year ago

Hi @dawe! We've regularly faced similar issues in the past, which were usually related to breaking changes in tensorflow or tensorflow-probability. Therefore, we recently re-implemented scCODA as part of the pertpy package, which does not rely on tensorflow anymore. You can try out the new implementation or use the known stable versions (tensorflow 2.8 and tf-probability 0.16) of these dependencies.